MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf\r
MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf\r
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
+ MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf\r
\r
MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf\r
MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf\r
--- /dev/null
+sndgk393 AT ybb DOT ne DOT jp (K.Kosako)\r
--- /dev/null
+Oniguruma LICENSE\r
+-----------------\r
+\r
+/*-\r
+ * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
--- /dev/null
+/** @file\r
+\r
+ Provide intrinsics within Oniguruma\r
+\r
+ Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR>\r
+\r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License that accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+//\r
+// From CryptoPkg/IntrinsicLib\r
+//\r
+\r
+/* Copies bytes between buffers */\r
+#pragma function(memcpy)\r
+void * memcpy (void *dest, const void *src, unsigned int count)\r
+{\r
+ return CopyMem (dest, src, (UINTN)count);\r
+}\r
+\r
+/* Sets buffers to a specified character */\r
+#pragma function(memset)\r
+void * memset (void *dest, char ch, unsigned int count)\r
+{\r
+ //\r
+ // NOTE: Here we use one base implementation for memset, instead of the direct\r
+ // optimized SetMem() wrapper. Because the IntrinsicLib has to be built\r
+ // without whole program optimization option, and there will be some\r
+ // potential register usage errors when calling other optimized codes.\r
+ //\r
+\r
+ //\r
+ // Declare the local variables that actually move the data elements as\r
+ // volatile to prevent the optimizer from replacing this function with\r
+ // the intrinsic memset()\r
+ //\r
+ volatile UINT8 *Pointer;\r
+\r
+ Pointer = (UINT8 *)dest;\r
+ while (count-- != 0) {\r
+ *(Pointer++) = ch;\r
+ }\r
+\r
+ return dest;\r
+}\r
--- /dev/null
+/** @file\r
+ \r
+ Module to rewrite stdlib references within Oniguruma\r
+\r
+ Copyright (c) 2014-2015, Hewlett-Packard Development Company, L.P.<BR>\r
+\r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License that accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+#include "OnigurumaUefiPort.h"\r
+\r
+int sprintf(char *str, char const *fmt, ...)\r
+{\r
+ VA_LIST Marker;\r
+ int NumberOfPrinted;\r
+\r
+ VA_START (Marker, fmt);\r
+ NumberOfPrinted = (int)AsciiVSPrint (str, 1000000, fmt, Marker);\r
+ VA_END (Marker);\r
+\r
+ return NumberOfPrinted;\r
+}\r
+\r
+int OnigStrCmp (char* Str1, char* Str2)\r
+{\r
+ return (int)AsciiStrCmp (Str1, Str2);\r
+}\r
--- /dev/null
+/** @file\r
+ \r
+ Module to rewrite stdlib references within Oniguruma\r
+\r
+ Copyright (c) 2014-2015, Hewlett-Packard Development Company, L.P.<BR>\r
+\r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License that accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+#ifndef ONIGURUMA_UEFI_PORT_H\r
+#define ONIGURUMA_UEFI_PORT_H\r
+\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#undef _WIN32\r
+#define P_(args) args\r
+\r
+#define SIZEOF_LONG sizeof(long)\r
+#define SIZEOF_INT sizeof(int)\r
+typedef UINTN size_t;\r
+\r
+#define malloc(n) AllocatePool(n)\r
+#define calloc(n,s) AllocateZeroPool((n)*(s))\r
+#define free(p) FreePool(p)\r
+#define realloc(OldPtr,NewSize,OldSize) ReallocatePool(OldSize,NewSize,OldPtr)\r
+#define xmemmove(Dest,Src,Length) CopyMem(Dest,Src,Length)\r
+#define xmemcpy(Dest,Src,Length) CopyMem(Dest,Src,Length)\r
+#define xmemset(Buffer,Value,Length) SetMem(Buffer,Length,Value)\r
+\r
+#define va_init_list(a,b) VA_START(a,b)\r
+#define va_list VA_LIST\r
+#define va_arg(a,b) VA_ARG(a,b)\r
+#define va_end(a) VA_END(a)\r
+\r
+#define FILE VOID\r
+#define stdout NULL\r
+#define fprintf(...)\r
+#define fputs(a,b)\r
+#define vsnprintf (int)AsciiVSPrint\r
+#define _vsnprintf vsnprintf\r
+\r
+#define setlocale(a,b)\r
+#define LC_ALL 0\r
+\r
+#define MAX_STRING_SIZE 0x1000\r
+#define strlen_s(String,MaxSize) AsciiStrnLenS (String, MaxSize)\r
+#define strcat_s(Dest,MaxSize,Src) AsciiStrCatS (Dest, MaxSize, Src)\r
+#define strncpy_s(Dest,MaxSize,Src,Length) AsciiStrnCpyS (Dest, MaxSize, Src, Length)\r
+#define strcmp OnigStrCmp\r
+\r
+int OnigStrCmp (char* Str1, char* Str2);\r
+\r
+int sprintf (char *str, char const *fmt, ...);\r
+\r
+#define exit(n) ASSERT(FALSE);\r
+\r
+#endif // !ONIGURUMA_UEFI_PORT_H\r
--- /dev/null
+README 2007/05/31\r
+\r
+Oniguruma ---- (C) K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+\r
+http://www.geocities.jp/kosako3/oniguruma/\r
+\r
+Oniguruma is a regular expressions library.\r
+The characteristics of this library is that different character encoding\r
+for every regular expression object can be specified.\r
+\r
+Supported character encodings:\r
+\r
+ ASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE,\r
+ EUC-JP, EUC-TW, EUC-KR, EUC-CN,\r
+ Shift_JIS, Big5, GB18030, KOI8-R, CP1251,\r
+ ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,\r
+ ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,\r
+ ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16\r
+\r
+* GB18030: contributed by KUBO Takehiro\r
+* CP1251: contributed by Byte\r
+------------------------------------------------------------\r
+\r
+License\r
+\r
+ BSD license.\r
+\r
+\r
+Install\r
+\r
+ Case 1: Unix and Cygwin platform\r
+\r
+ 1. ./configure\r
+ 2. make\r
+ 3. make install\r
+\r
+ * uninstall\r
+\r
+ make uninstall\r
+\r
+ * test (ASCII/EUC-JP)\r
+\r
+ make atest\r
+\r
+ * configuration check\r
+\r
+ onig-config --cflags\r
+ onig-config --libs\r
+ onig-config --prefix\r
+ onig-config --exec-prefix\r
+\r
+\r
+\r
+ Case 2: Win32 platform (VC++)\r
+\r
+ 1. copy win32\Makefile Makefile\r
+ 2. copy win32\config.h config.h\r
+ 3. nmake\r
+\r
+ onig_s.lib: static link library\r
+ onig.dll: dynamic link library\r
+\r
+ * test (ASCII/Shift_JIS)\r
+ 4. copy win32\testc.c testc.c\r
+ 5. nmake ctest\r
+\r
+\r
+\r
+Regular Expressions\r
+\r
+ See doc/RE (or doc/RE.ja for Japanese).\r
+\r
+\r
+Usage\r
+\r
+ Include oniguruma.h in your program. (Oniguruma API)\r
+ See doc/API for Oniguruma API.\r
+\r
+ If you want to disable UChar type (== unsigned char) definition\r
+ in oniguruma.h, define ONIG_ESCAPE_UCHAR_COLLISION and then \r
+ include oniguruma.h.\r
+\r
+ If you want to disable regex_t type definition in oniguruma.h,\r
+ define ONIG_ESCAPE_REGEX_T_COLLISION and then include oniguruma.h.\r
+\r
+ Example of the compiling/linking command line in Unix or Cygwin,\r
+ (prefix == /usr/local case)\r
+\r
+ cc sample.c -L/usr/local/lib -lonig\r
+\r
+\r
+ If you want to use static link library(onig_s.lib) in Win32,\r
+ add option -DONIG_EXTERN=extern to C compiler.\r
+\r
+\r
+\r
+Sample Programs\r
+\r
+ sample/simple.c example of the minimum (Oniguruma API)\r
+ sample/names.c example of the named group callback.\r
+ sample/encode.c example of some encodings.\r
+ sample/listcap.c example of the capture history.\r
+ sample/posix.c POSIX API sample.\r
+ sample/sql.c example of the variable meta characters.\r
+ (SQL-like pattern matching)\r
+\r
+Test Programs\r
+ sample/syntax.c Perl, Java and ASIS syntax test.\r
+ sample/crnl.c --enable-crnl-as-line-terminator test\r
+\r
+\r
+Source Files\r
+\r
+ oniguruma.h Oniguruma API header file. (public)\r
+ onig-config.in configuration check program template.\r
+\r
+ regenc.h character encodings framework header file.\r
+ regint.h internal definitions\r
+ regparse.h internal definitions for regparse.c and regcomp.c\r
+ regcomp.c compiling and optimization functions\r
+ regenc.c character encodings framework.\r
+ regerror.c error message function\r
+ regext.c extended API functions. (deluxe version API)\r
+ regexec.c search and match functions\r
+ regparse.c parsing functions.\r
+ regsyntax.c pattern syntax functions and built-in syntax definitions.\r
+ regtrav.c capture history tree data traverse functions.\r
+ regversion.c version info function.\r
+ st.h hash table functions header file\r
+ st.c hash table functions\r
+\r
+ oniggnu.h GNU regex API header file. (public)\r
+ reggnu.c GNU regex API functions\r
+\r
+ onigposix.h POSIX API header file. (public)\r
+ regposerr.c POSIX error message function.\r
+ regposix.c POSIX API functions.\r
+\r
+ enc/mktable.c character type table generator.\r
+ enc/ascii.c ASCII encoding.\r
+ enc/euc_jp.c EUC-JP encoding.\r
+ enc/euc_tw.c EUC-TW encoding.\r
+ enc/euc_kr.c EUC-KR, EUC-CN encoding.\r
+ enc/sjis.c Shift_JIS encoding.\r
+ enc/big5.c Big5 encoding.\r
+ enc/gb18030.c GB18030 encoding.\r
+ enc/koi8.c KOI8 encoding.\r
+ enc/koi8_r.c KOI8-R encoding.\r
+ enc/cp1251.c CP1251 encoding.\r
+ enc/iso8859_1.c ISO-8859-1 encoding. (Latin-1)\r
+ enc/iso8859_2.c ISO-8859-2 encoding. (Latin-2)\r
+ enc/iso8859_3.c ISO-8859-3 encoding. (Latin-3)\r
+ enc/iso8859_4.c ISO-8859-4 encoding. (Latin-4)\r
+ enc/iso8859_5.c ISO-8859-5 encoding. (Cyrillic)\r
+ enc/iso8859_6.c ISO-8859-6 encoding. (Arabic)\r
+ enc/iso8859_7.c ISO-8859-7 encoding. (Greek)\r
+ enc/iso8859_8.c ISO-8859-8 encoding. (Hebrew)\r
+ enc/iso8859_9.c ISO-8859-9 encoding. (Latin-5 or Turkish)\r
+ enc/iso8859_10.c ISO-8859-10 encoding. (Latin-6 or Nordic)\r
+ enc/iso8859_11.c ISO-8859-11 encoding. (Thai)\r
+ enc/iso8859_13.c ISO-8859-13 encoding. (Latin-7 or Baltic Rim)\r
+ enc/iso8859_14.c ISO-8859-14 encoding. (Latin-8 or Celtic)\r
+ enc/iso8859_15.c ISO-8859-15 encoding. (Latin-9 or West European with Euro)\r
+ enc/iso8859_16.c ISO-8859-16 encoding.\r
+ (Latin-10 or South-Eastern European with Euro)\r
+ enc/utf8.c UTF-8 encoding.\r
+ enc/utf16_be.c UTF-16BE encoding.\r
+ enc/utf16_le.c UTF-16LE encoding.\r
+ enc/utf32_be.c UTF-32BE encoding.\r
+ enc/utf32_le.c UTF-32LE encoding.\r
+ enc/unicode.c Unicode information data.\r
+\r
+ win32/Makefile Makefile for Win32 (VC++)\r
+ win32/config.h config.h for Win32\r
+\r
+\r
+\r
+ToDo\r
+\r
+ ? case fold flag: Katakana <-> Hiragana.\r
+ ? add ONIG_OPTION_NOTBOS/NOTEOS. (\A, \z, \Z)\r
+ ?? \X (== \PM\pM*)\r
+ ?? implement syntax behavior ONIG_SYN_CONTEXT_INDEP_ANCHORS.\r
+ ?? transmission stopper. (return ONIG_STOP from match_at())\r
+\r
+and I'm thankful to Akinori MUSHA.\r
+\r
+\r
+Mail Address: K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
--- /dev/null
+/**********************************************************************\r
+ ascii.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2006 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regenc.h"\r
+\r
+static int\r
+ascii_is_code_ctype(OnigCodePoint code, unsigned int ctype)\r
+{\r
+ if (code < 128)\r
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+OnigEncodingType OnigEncodingASCII = {\r
+ onigenc_single_byte_mbc_enc_len,\r
+ "US-ASCII", /* name */\r
+ 1, /* max byte length */\r
+ 1, /* min byte length */\r
+ onigenc_is_mbc_newline_0x0a,\r
+ onigenc_single_byte_mbc_to_code,\r
+ onigenc_single_byte_code_to_mbclen,\r
+ onigenc_single_byte_code_to_mbc,\r
+ onigenc_ascii_mbc_case_fold,\r
+ onigenc_ascii_apply_all_case_fold,\r
+ onigenc_ascii_get_case_fold_codes_by_str,\r
+ onigenc_minimum_property_name_to_ctype,\r
+ ascii_is_code_ctype,\r
+ onigenc_not_support_get_ctype_code_range,\r
+ onigenc_single_byte_left_adjust_char_head,\r
+ onigenc_always_true_is_allowed_reverse_match\r
+};\r
--- /dev/null
+/**********************************************************************\r
+ unicode.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2013 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+#define ONIGENC_IS_UNICODE_ISO_8859_1_CTYPE(code,ctype) \\r
+ ((EncUNICODE_ISO_8859_1_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\r
+#if 0\r
+#define ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(code,cbit) \\r
+ ((EncUNICODE_ISO_8859_1_CtypeTable[code] & (cbit)) != 0)\r
+#endif\r
+\r
+static const unsigned short EncUNICODE_ISO_8859_1_CtypeTable[256] = {\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4008, 0x428c, 0x4289, 0x4288, 0x4288, 0x4288, 0x4008, 0x4008,\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\r
+ 0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\r
+ 0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\r
+ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0288, 0x0008, 0x0008,\r
+ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\r
+ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\r
+ 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\r
+ 0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\r
+ 0x00a0, 0x00a0, 0x30e2, 0x01a0, 0x00a0, 0x00a8, 0x00a0, 0x00a0,\r
+ 0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x00a0, 0x01a0,\r
+ 0x00a0, 0x10a0, 0x30e2, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x01a0,\r
+ 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\r
+ 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\r
+ 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\r
+ 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\r
+ 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\r
+ 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\r
+ 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\r
+ 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\r
+};\r
+\r
+/* 'NEWLINE' */\r
+static const OnigCodePoint CR_NEWLINE[] = {\r
+ 1,\r
+ 0x000a, 0x000a\r
+}; /* CR_NEWLINE */\r
+\r
+/* 'Alpha': [[:Alpha:]] */\r
+static const OnigCodePoint CR_Alpha[] = {\r
+ 418,\r
+ 0x0041, 0x005a,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b5, 0x00b5,\r
+ 0x00ba, 0x00ba,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00f6,\r
+ 0x00f8, 0x0241,\r
+ 0x0250, 0x02c1,\r
+ 0x02c6, 0x02d1,\r
+ 0x02e0, 0x02e4,\r
+ 0x02ee, 0x02ee,\r
+ 0x0300, 0x036f,\r
+ 0x037a, 0x037a,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x03f5,\r
+ 0x03f7, 0x0481,\r
+ 0x0483, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x0559,\r
+ 0x0561, 0x0587,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05bd,\r
+ 0x05bf, 0x05bf,\r
+ 0x05c1, 0x05c2,\r
+ 0x05c4, 0x05c5,\r
+ 0x05c7, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f2,\r
+ 0x0610, 0x0615,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x066e, 0x06d3,\r
+ 0x06d5, 0x06dc,\r
+ 0x06de, 0x06e8,\r
+ 0x06ea, 0x06ef,\r
+ 0x06fa, 0x06fc,\r
+ 0x06ff, 0x06ff,\r
+ 0x0710, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0963,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09f0, 0x09f1,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a70, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b71, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df3,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e40, 0x0e4e,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f00,\r
+ 0x0f18, 0x0f19,\r
+ 0x0f35, 0x0f35,\r
+ 0x0f37, 0x0f37,\r
+ 0x0f39, 0x0f39,\r
+ 0x0f3e, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f84,\r
+ 0x0f86, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fc6, 0x0fc6,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1050, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fa,\r
+ 0x10fc, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x135f,\r
+ 0x1380, 0x138f,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x166c,\r
+ 0x166f, 0x1676,\r
+ 0x1681, 0x169a,\r
+ 0x16a0, 0x16ea,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1734,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17b3,\r
+ 0x17b6, 0x17d3,\r
+ 0x17d7, 0x17d7,\r
+ 0x17dc, 0x17dd,\r
+ 0x180b, 0x180d,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1950, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x1a00, 0x1a1b,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fbc,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fcc,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fe0, 0x1fec,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffc,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x2090, 0x2094,\r
+ 0x20d0, 0x20eb,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210a, 0x2113,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x212f, 0x2131,\r
+ 0x2133, 0x2139,\r
+ 0x213c, 0x213f,\r
+ 0x2145, 0x2149,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2ce4,\r
+ 0x2d00, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x3005, 0x3006,\r
+ 0x302a, 0x302f,\r
+ 0x3031, 0x3035,\r
+ 0x303b, 0x303c,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x309a,\r
+ 0x309d, 0x309f,\r
+ 0x30a1, 0x30fa,\r
+ 0x30fc, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x31a0, 0x31b7,\r
+ 0x31f0, 0x31ff,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa800, 0xa827,\r
+ 0xac00, 0xd7a3,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb28,\r
+ 0xfb2a, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfb,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xff21, 0xff3a,\r
+ 0xff41, 0xff5a,\r
+ 0xff66, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10300, 0x1031e,\r
+ 0x10330, 0x10349,\r
+ 0x10380, 0x1039d,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103cf,\r
+ 0x10400, 0x1049d,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a3f,\r
+ 0x1d165, 0x1d169,\r
+ 0x1d16d, 0x1d172,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0x1d242, 0x1d244,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6fa,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d734,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d76e,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d7a8,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_Alpha */\r
+\r
+/* 'Blank': [[:Blank:]] */\r
+static const OnigCodePoint CR_Blank[] = {\r
+ 9,\r
+ 0x0009, 0x0009,\r
+ 0x0020, 0x0020,\r
+ 0x00a0, 0x00a0,\r
+ 0x1680, 0x1680,\r
+ 0x180e, 0x180e,\r
+ 0x2000, 0x200a,\r
+ 0x202f, 0x202f,\r
+ 0x205f, 0x205f,\r
+ 0x3000, 0x3000\r
+}; /* CR_Blank */\r
+\r
+/* 'Cntrl': [[:Cntrl:]] */\r
+static const OnigCodePoint CR_Cntrl[] = {\r
+ 19,\r
+ 0x0000, 0x001f,\r
+ 0x007f, 0x009f,\r
+ 0x00ad, 0x00ad,\r
+ 0x0600, 0x0603,\r
+ 0x06dd, 0x06dd,\r
+ 0x070f, 0x070f,\r
+ 0x17b4, 0x17b5,\r
+ 0x200b, 0x200f,\r
+ 0x202a, 0x202e,\r
+ 0x2060, 0x2063,\r
+ 0x206a, 0x206f,\r
+ 0xd800, 0xf8ff,\r
+ 0xfeff, 0xfeff,\r
+ 0xfff9, 0xfffb,\r
+ 0x1d173, 0x1d17a,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Cntrl */\r
+\r
+/* 'Digit': [[:Digit:]] */\r
+static const OnigCodePoint CR_Digit[] = {\r
+ 23,\r
+ 0x0030, 0x0039,\r
+ 0x0660, 0x0669,\r
+ 0x06f0, 0x06f9,\r
+ 0x0966, 0x096f,\r
+ 0x09e6, 0x09ef,\r
+ 0x0a66, 0x0a6f,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0b66, 0x0b6f,\r
+ 0x0be6, 0x0bef,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0e50, 0x0e59,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0f20, 0x0f29,\r
+ 0x1040, 0x1049,\r
+ 0x17e0, 0x17e9,\r
+ 0x1810, 0x1819,\r
+ 0x1946, 0x194f,\r
+ 0x19d0, 0x19d9,\r
+ 0xff10, 0xff19,\r
+ 0x104a0, 0x104a9,\r
+ 0x1d7ce, 0x1d7ff\r
+}; /* CR_Digit */\r
+\r
+/* 'Graph': [[:Graph:]] */\r
+static const OnigCodePoint CR_Graph[] = {\r
+ 424,\r
+ 0x0021, 0x007e,\r
+ 0x00a1, 0x0241,\r
+ 0x0250, 0x036f,\r
+ 0x0374, 0x0375,\r
+ 0x037a, 0x037a,\r
+ 0x037e, 0x037e,\r
+ 0x0384, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x055f,\r
+ 0x0561, 0x0587,\r
+ 0x0589, 0x058a,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f4,\r
+ 0x0600, 0x0603,\r
+ 0x060b, 0x0615,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x0660, 0x070d,\r
+ 0x070f, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0970,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09fa,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0af1, 0x0af1,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bfa,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df4,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e3f, 0x0e5b,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fbe, 0x0fcc,\r
+ 0x0fcf, 0x0fd1,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x137c,\r
+ 0x1380, 0x1399,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x1676,\r
+ 0x1681, 0x169c,\r
+ 0x16a0, 0x16f0,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1736,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x1800, 0x180d,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1940, 0x1940,\r
+ 0x1944, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x19de, 0x1a1b,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fc4,\r
+ 0x1fc6, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fdd, 0x1fef,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffe,\r
+ 0x200b, 0x2027,\r
+ 0x202a, 0x202e,\r
+ 0x2030, 0x205e,\r
+ 0x2060, 0x2063,\r
+ 0x206a, 0x2071,\r
+ 0x2074, 0x208e,\r
+ 0x2090, 0x2094,\r
+ 0x20a0, 0x20b5,\r
+ 0x20d0, 0x20eb,\r
+ 0x2100, 0x214c,\r
+ 0x2153, 0x2183,\r
+ 0x2190, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x2460, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x27c0, 0x27c6,\r
+ 0x27d0, 0x27eb,\r
+ 0x27f0, 0x2b13,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2cea,\r
+ 0x2cf9, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3001, 0x303f,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x3190, 0x31b7,\r
+ 0x31c0, 0x31cf,\r
+ 0x31f0, 0x321e,\r
+ 0x3220, 0x3243,\r
+ 0x3250, 0x32fe,\r
+ 0x3300, 0x4db5,\r
+ 0x4dc0, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa490, 0xa4c6,\r
+ 0xa700, 0xa716,\r
+ 0xa800, 0xa82b,\r
+ 0xac00, 0xd7a3,\r
+ 0xe000, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3f,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfd,\r
+ 0xfe00, 0xfe19,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe66,\r
+ 0xfe68, 0xfe6b,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xfeff, 0xfeff,\r
+ 0xff01, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0xffe0, 0xffe6,\r
+ 0xffe8, 0xffee,\r
+ 0xfff9, 0xfffd,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10100, 0x10102,\r
+ 0x10107, 0x10133,\r
+ 0x10137, 0x1018a,\r
+ 0x10300, 0x1031e,\r
+ 0x10320, 0x10323,\r
+ 0x10330, 0x1034a,\r
+ 0x10380, 0x1039d,\r
+ 0x1039f, 0x103c3,\r
+ 0x103c8, 0x103d5,\r
+ 0x10400, 0x1049d,\r
+ 0x104a0, 0x104a9,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a47,\r
+ 0x10a50, 0x10a58,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d1dd,\r
+ 0x1d200, 0x1d245,\r
+ 0x1d300, 0x1d356,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f,\r
+ 0xe0100, 0xe01ef,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Graph */\r
+\r
+/* 'Lower': [[:Lower:]] */\r
+static const OnigCodePoint CR_Lower[] = {\r
+ 480,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b5, 0x00b5,\r
+ 0x00ba, 0x00ba,\r
+ 0x00df, 0x00f6,\r
+ 0x00f8, 0x00ff,\r
+ 0x0101, 0x0101,\r
+ 0x0103, 0x0103,\r
+ 0x0105, 0x0105,\r
+ 0x0107, 0x0107,\r
+ 0x0109, 0x0109,\r
+ 0x010b, 0x010b,\r
+ 0x010d, 0x010d,\r
+ 0x010f, 0x010f,\r
+ 0x0111, 0x0111,\r
+ 0x0113, 0x0113,\r
+ 0x0115, 0x0115,\r
+ 0x0117, 0x0117,\r
+ 0x0119, 0x0119,\r
+ 0x011b, 0x011b,\r
+ 0x011d, 0x011d,\r
+ 0x011f, 0x011f,\r
+ 0x0121, 0x0121,\r
+ 0x0123, 0x0123,\r
+ 0x0125, 0x0125,\r
+ 0x0127, 0x0127,\r
+ 0x0129, 0x0129,\r
+ 0x012b, 0x012b,\r
+ 0x012d, 0x012d,\r
+ 0x012f, 0x012f,\r
+ 0x0131, 0x0131,\r
+ 0x0133, 0x0133,\r
+ 0x0135, 0x0135,\r
+ 0x0137, 0x0138,\r
+ 0x013a, 0x013a,\r
+ 0x013c, 0x013c,\r
+ 0x013e, 0x013e,\r
+ 0x0140, 0x0140,\r
+ 0x0142, 0x0142,\r
+ 0x0144, 0x0144,\r
+ 0x0146, 0x0146,\r
+ 0x0148, 0x0149,\r
+ 0x014b, 0x014b,\r
+ 0x014d, 0x014d,\r
+ 0x014f, 0x014f,\r
+ 0x0151, 0x0151,\r
+ 0x0153, 0x0153,\r
+ 0x0155, 0x0155,\r
+ 0x0157, 0x0157,\r
+ 0x0159, 0x0159,\r
+ 0x015b, 0x015b,\r
+ 0x015d, 0x015d,\r
+ 0x015f, 0x015f,\r
+ 0x0161, 0x0161,\r
+ 0x0163, 0x0163,\r
+ 0x0165, 0x0165,\r
+ 0x0167, 0x0167,\r
+ 0x0169, 0x0169,\r
+ 0x016b, 0x016b,\r
+ 0x016d, 0x016d,\r
+ 0x016f, 0x016f,\r
+ 0x0171, 0x0171,\r
+ 0x0173, 0x0173,\r
+ 0x0175, 0x0175,\r
+ 0x0177, 0x0177,\r
+ 0x017a, 0x017a,\r
+ 0x017c, 0x017c,\r
+ 0x017e, 0x0180,\r
+ 0x0183, 0x0183,\r
+ 0x0185, 0x0185,\r
+ 0x0188, 0x0188,\r
+ 0x018c, 0x018d,\r
+ 0x0192, 0x0192,\r
+ 0x0195, 0x0195,\r
+ 0x0199, 0x019b,\r
+ 0x019e, 0x019e,\r
+ 0x01a1, 0x01a1,\r
+ 0x01a3, 0x01a3,\r
+ 0x01a5, 0x01a5,\r
+ 0x01a8, 0x01a8,\r
+ 0x01aa, 0x01ab,\r
+ 0x01ad, 0x01ad,\r
+ 0x01b0, 0x01b0,\r
+ 0x01b4, 0x01b4,\r
+ 0x01b6, 0x01b6,\r
+ 0x01b9, 0x01ba,\r
+ 0x01bd, 0x01bf,\r
+ 0x01c6, 0x01c6,\r
+ 0x01c9, 0x01c9,\r
+ 0x01cc, 0x01cc,\r
+ 0x01ce, 0x01ce,\r
+ 0x01d0, 0x01d0,\r
+ 0x01d2, 0x01d2,\r
+ 0x01d4, 0x01d4,\r
+ 0x01d6, 0x01d6,\r
+ 0x01d8, 0x01d8,\r
+ 0x01da, 0x01da,\r
+ 0x01dc, 0x01dd,\r
+ 0x01df, 0x01df,\r
+ 0x01e1, 0x01e1,\r
+ 0x01e3, 0x01e3,\r
+ 0x01e5, 0x01e5,\r
+ 0x01e7, 0x01e7,\r
+ 0x01e9, 0x01e9,\r
+ 0x01eb, 0x01eb,\r
+ 0x01ed, 0x01ed,\r
+ 0x01ef, 0x01f0,\r
+ 0x01f3, 0x01f3,\r
+ 0x01f5, 0x01f5,\r
+ 0x01f9, 0x01f9,\r
+ 0x01fb, 0x01fb,\r
+ 0x01fd, 0x01fd,\r
+ 0x01ff, 0x01ff,\r
+ 0x0201, 0x0201,\r
+ 0x0203, 0x0203,\r
+ 0x0205, 0x0205,\r
+ 0x0207, 0x0207,\r
+ 0x0209, 0x0209,\r
+ 0x020b, 0x020b,\r
+ 0x020d, 0x020d,\r
+ 0x020f, 0x020f,\r
+ 0x0211, 0x0211,\r
+ 0x0213, 0x0213,\r
+ 0x0215, 0x0215,\r
+ 0x0217, 0x0217,\r
+ 0x0219, 0x0219,\r
+ 0x021b, 0x021b,\r
+ 0x021d, 0x021d,\r
+ 0x021f, 0x021f,\r
+ 0x0221, 0x0221,\r
+ 0x0223, 0x0223,\r
+ 0x0225, 0x0225,\r
+ 0x0227, 0x0227,\r
+ 0x0229, 0x0229,\r
+ 0x022b, 0x022b,\r
+ 0x022d, 0x022d,\r
+ 0x022f, 0x022f,\r
+ 0x0231, 0x0231,\r
+ 0x0233, 0x0239,\r
+ 0x023c, 0x023c,\r
+ 0x023f, 0x0240,\r
+ 0x0250, 0x02af,\r
+ 0x0390, 0x0390,\r
+ 0x03ac, 0x03ce,\r
+ 0x03d0, 0x03d1,\r
+ 0x03d5, 0x03d7,\r
+ 0x03d9, 0x03d9,\r
+ 0x03db, 0x03db,\r
+ 0x03dd, 0x03dd,\r
+ 0x03df, 0x03df,\r
+ 0x03e1, 0x03e1,\r
+ 0x03e3, 0x03e3,\r
+ 0x03e5, 0x03e5,\r
+ 0x03e7, 0x03e7,\r
+ 0x03e9, 0x03e9,\r
+ 0x03eb, 0x03eb,\r
+ 0x03ed, 0x03ed,\r
+ 0x03ef, 0x03f3,\r
+ 0x03f5, 0x03f5,\r
+ 0x03f8, 0x03f8,\r
+ 0x03fb, 0x03fc,\r
+ 0x0430, 0x045f,\r
+ 0x0461, 0x0461,\r
+ 0x0463, 0x0463,\r
+ 0x0465, 0x0465,\r
+ 0x0467, 0x0467,\r
+ 0x0469, 0x0469,\r
+ 0x046b, 0x046b,\r
+ 0x046d, 0x046d,\r
+ 0x046f, 0x046f,\r
+ 0x0471, 0x0471,\r
+ 0x0473, 0x0473,\r
+ 0x0475, 0x0475,\r
+ 0x0477, 0x0477,\r
+ 0x0479, 0x0479,\r
+ 0x047b, 0x047b,\r
+ 0x047d, 0x047d,\r
+ 0x047f, 0x047f,\r
+ 0x0481, 0x0481,\r
+ 0x048b, 0x048b,\r
+ 0x048d, 0x048d,\r
+ 0x048f, 0x048f,\r
+ 0x0491, 0x0491,\r
+ 0x0493, 0x0493,\r
+ 0x0495, 0x0495,\r
+ 0x0497, 0x0497,\r
+ 0x0499, 0x0499,\r
+ 0x049b, 0x049b,\r
+ 0x049d, 0x049d,\r
+ 0x049f, 0x049f,\r
+ 0x04a1, 0x04a1,\r
+ 0x04a3, 0x04a3,\r
+ 0x04a5, 0x04a5,\r
+ 0x04a7, 0x04a7,\r
+ 0x04a9, 0x04a9,\r
+ 0x04ab, 0x04ab,\r
+ 0x04ad, 0x04ad,\r
+ 0x04af, 0x04af,\r
+ 0x04b1, 0x04b1,\r
+ 0x04b3, 0x04b3,\r
+ 0x04b5, 0x04b5,\r
+ 0x04b7, 0x04b7,\r
+ 0x04b9, 0x04b9,\r
+ 0x04bb, 0x04bb,\r
+ 0x04bd, 0x04bd,\r
+ 0x04bf, 0x04bf,\r
+ 0x04c2, 0x04c2,\r
+ 0x04c4, 0x04c4,\r
+ 0x04c6, 0x04c6,\r
+ 0x04c8, 0x04c8,\r
+ 0x04ca, 0x04ca,\r
+ 0x04cc, 0x04cc,\r
+ 0x04ce, 0x04ce,\r
+ 0x04d1, 0x04d1,\r
+ 0x04d3, 0x04d3,\r
+ 0x04d5, 0x04d5,\r
+ 0x04d7, 0x04d7,\r
+ 0x04d9, 0x04d9,\r
+ 0x04db, 0x04db,\r
+ 0x04dd, 0x04dd,\r
+ 0x04df, 0x04df,\r
+ 0x04e1, 0x04e1,\r
+ 0x04e3, 0x04e3,\r
+ 0x04e5, 0x04e5,\r
+ 0x04e7, 0x04e7,\r
+ 0x04e9, 0x04e9,\r
+ 0x04eb, 0x04eb,\r
+ 0x04ed, 0x04ed,\r
+ 0x04ef, 0x04ef,\r
+ 0x04f1, 0x04f1,\r
+ 0x04f3, 0x04f3,\r
+ 0x04f5, 0x04f5,\r
+ 0x04f7, 0x04f7,\r
+ 0x04f9, 0x04f9,\r
+ 0x0501, 0x0501,\r
+ 0x0503, 0x0503,\r
+ 0x0505, 0x0505,\r
+ 0x0507, 0x0507,\r
+ 0x0509, 0x0509,\r
+ 0x050b, 0x050b,\r
+ 0x050d, 0x050d,\r
+ 0x050f, 0x050f,\r
+ 0x0561, 0x0587,\r
+ 0x1d00, 0x1d2b,\r
+ 0x1d62, 0x1d77,\r
+ 0x1d79, 0x1d9a,\r
+ 0x1e01, 0x1e01,\r
+ 0x1e03, 0x1e03,\r
+ 0x1e05, 0x1e05,\r
+ 0x1e07, 0x1e07,\r
+ 0x1e09, 0x1e09,\r
+ 0x1e0b, 0x1e0b,\r
+ 0x1e0d, 0x1e0d,\r
+ 0x1e0f, 0x1e0f,\r
+ 0x1e11, 0x1e11,\r
+ 0x1e13, 0x1e13,\r
+ 0x1e15, 0x1e15,\r
+ 0x1e17, 0x1e17,\r
+ 0x1e19, 0x1e19,\r
+ 0x1e1b, 0x1e1b,\r
+ 0x1e1d, 0x1e1d,\r
+ 0x1e1f, 0x1e1f,\r
+ 0x1e21, 0x1e21,\r
+ 0x1e23, 0x1e23,\r
+ 0x1e25, 0x1e25,\r
+ 0x1e27, 0x1e27,\r
+ 0x1e29, 0x1e29,\r
+ 0x1e2b, 0x1e2b,\r
+ 0x1e2d, 0x1e2d,\r
+ 0x1e2f, 0x1e2f,\r
+ 0x1e31, 0x1e31,\r
+ 0x1e33, 0x1e33,\r
+ 0x1e35, 0x1e35,\r
+ 0x1e37, 0x1e37,\r
+ 0x1e39, 0x1e39,\r
+ 0x1e3b, 0x1e3b,\r
+ 0x1e3d, 0x1e3d,\r
+ 0x1e3f, 0x1e3f,\r
+ 0x1e41, 0x1e41,\r
+ 0x1e43, 0x1e43,\r
+ 0x1e45, 0x1e45,\r
+ 0x1e47, 0x1e47,\r
+ 0x1e49, 0x1e49,\r
+ 0x1e4b, 0x1e4b,\r
+ 0x1e4d, 0x1e4d,\r
+ 0x1e4f, 0x1e4f,\r
+ 0x1e51, 0x1e51,\r
+ 0x1e53, 0x1e53,\r
+ 0x1e55, 0x1e55,\r
+ 0x1e57, 0x1e57,\r
+ 0x1e59, 0x1e59,\r
+ 0x1e5b, 0x1e5b,\r
+ 0x1e5d, 0x1e5d,\r
+ 0x1e5f, 0x1e5f,\r
+ 0x1e61, 0x1e61,\r
+ 0x1e63, 0x1e63,\r
+ 0x1e65, 0x1e65,\r
+ 0x1e67, 0x1e67,\r
+ 0x1e69, 0x1e69,\r
+ 0x1e6b, 0x1e6b,\r
+ 0x1e6d, 0x1e6d,\r
+ 0x1e6f, 0x1e6f,\r
+ 0x1e71, 0x1e71,\r
+ 0x1e73, 0x1e73,\r
+ 0x1e75, 0x1e75,\r
+ 0x1e77, 0x1e77,\r
+ 0x1e79, 0x1e79,\r
+ 0x1e7b, 0x1e7b,\r
+ 0x1e7d, 0x1e7d,\r
+ 0x1e7f, 0x1e7f,\r
+ 0x1e81, 0x1e81,\r
+ 0x1e83, 0x1e83,\r
+ 0x1e85, 0x1e85,\r
+ 0x1e87, 0x1e87,\r
+ 0x1e89, 0x1e89,\r
+ 0x1e8b, 0x1e8b,\r
+ 0x1e8d, 0x1e8d,\r
+ 0x1e8f, 0x1e8f,\r
+ 0x1e91, 0x1e91,\r
+ 0x1e93, 0x1e93,\r
+ 0x1e95, 0x1e9b,\r
+ 0x1ea1, 0x1ea1,\r
+ 0x1ea3, 0x1ea3,\r
+ 0x1ea5, 0x1ea5,\r
+ 0x1ea7, 0x1ea7,\r
+ 0x1ea9, 0x1ea9,\r
+ 0x1eab, 0x1eab,\r
+ 0x1ead, 0x1ead,\r
+ 0x1eaf, 0x1eaf,\r
+ 0x1eb1, 0x1eb1,\r
+ 0x1eb3, 0x1eb3,\r
+ 0x1eb5, 0x1eb5,\r
+ 0x1eb7, 0x1eb7,\r
+ 0x1eb9, 0x1eb9,\r
+ 0x1ebb, 0x1ebb,\r
+ 0x1ebd, 0x1ebd,\r
+ 0x1ebf, 0x1ebf,\r
+ 0x1ec1, 0x1ec1,\r
+ 0x1ec3, 0x1ec3,\r
+ 0x1ec5, 0x1ec5,\r
+ 0x1ec7, 0x1ec7,\r
+ 0x1ec9, 0x1ec9,\r
+ 0x1ecb, 0x1ecb,\r
+ 0x1ecd, 0x1ecd,\r
+ 0x1ecf, 0x1ecf,\r
+ 0x1ed1, 0x1ed1,\r
+ 0x1ed3, 0x1ed3,\r
+ 0x1ed5, 0x1ed5,\r
+ 0x1ed7, 0x1ed7,\r
+ 0x1ed9, 0x1ed9,\r
+ 0x1edb, 0x1edb,\r
+ 0x1edd, 0x1edd,\r
+ 0x1edf, 0x1edf,\r
+ 0x1ee1, 0x1ee1,\r
+ 0x1ee3, 0x1ee3,\r
+ 0x1ee5, 0x1ee5,\r
+ 0x1ee7, 0x1ee7,\r
+ 0x1ee9, 0x1ee9,\r
+ 0x1eeb, 0x1eeb,\r
+ 0x1eed, 0x1eed,\r
+ 0x1eef, 0x1eef,\r
+ 0x1ef1, 0x1ef1,\r
+ 0x1ef3, 0x1ef3,\r
+ 0x1ef5, 0x1ef5,\r
+ 0x1ef7, 0x1ef7,\r
+ 0x1ef9, 0x1ef9,\r
+ 0x1f00, 0x1f07,\r
+ 0x1f10, 0x1f15,\r
+ 0x1f20, 0x1f27,\r
+ 0x1f30, 0x1f37,\r
+ 0x1f40, 0x1f45,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f60, 0x1f67,\r
+ 0x1f70, 0x1f7d,\r
+ 0x1f80, 0x1f87,\r
+ 0x1f90, 0x1f97,\r
+ 0x1fa0, 0x1fa7,\r
+ 0x1fb0, 0x1fb4,\r
+ 0x1fb6, 0x1fb7,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fc7,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fd7,\r
+ 0x1fe0, 0x1fe7,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ff7,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x210a, 0x210a,\r
+ 0x210e, 0x210f,\r
+ 0x2113, 0x2113,\r
+ 0x212f, 0x212f,\r
+ 0x2134, 0x2134,\r
+ 0x2139, 0x2139,\r
+ 0x213c, 0x213d,\r
+ 0x2146, 0x2149,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c81, 0x2c81,\r
+ 0x2c83, 0x2c83,\r
+ 0x2c85, 0x2c85,\r
+ 0x2c87, 0x2c87,\r
+ 0x2c89, 0x2c89,\r
+ 0x2c8b, 0x2c8b,\r
+ 0x2c8d, 0x2c8d,\r
+ 0x2c8f, 0x2c8f,\r
+ 0x2c91, 0x2c91,\r
+ 0x2c93, 0x2c93,\r
+ 0x2c95, 0x2c95,\r
+ 0x2c97, 0x2c97,\r
+ 0x2c99, 0x2c99,\r
+ 0x2c9b, 0x2c9b,\r
+ 0x2c9d, 0x2c9d,\r
+ 0x2c9f, 0x2c9f,\r
+ 0x2ca1, 0x2ca1,\r
+ 0x2ca3, 0x2ca3,\r
+ 0x2ca5, 0x2ca5,\r
+ 0x2ca7, 0x2ca7,\r
+ 0x2ca9, 0x2ca9,\r
+ 0x2cab, 0x2cab,\r
+ 0x2cad, 0x2cad,\r
+ 0x2caf, 0x2caf,\r
+ 0x2cb1, 0x2cb1,\r
+ 0x2cb3, 0x2cb3,\r
+ 0x2cb5, 0x2cb5,\r
+ 0x2cb7, 0x2cb7,\r
+ 0x2cb9, 0x2cb9,\r
+ 0x2cbb, 0x2cbb,\r
+ 0x2cbd, 0x2cbd,\r
+ 0x2cbf, 0x2cbf,\r
+ 0x2cc1, 0x2cc1,\r
+ 0x2cc3, 0x2cc3,\r
+ 0x2cc5, 0x2cc5,\r
+ 0x2cc7, 0x2cc7,\r
+ 0x2cc9, 0x2cc9,\r
+ 0x2ccb, 0x2ccb,\r
+ 0x2ccd, 0x2ccd,\r
+ 0x2ccf, 0x2ccf,\r
+ 0x2cd1, 0x2cd1,\r
+ 0x2cd3, 0x2cd3,\r
+ 0x2cd5, 0x2cd5,\r
+ 0x2cd7, 0x2cd7,\r
+ 0x2cd9, 0x2cd9,\r
+ 0x2cdb, 0x2cdb,\r
+ 0x2cdd, 0x2cdd,\r
+ 0x2cdf, 0x2cdf,\r
+ 0x2ce1, 0x2ce1,\r
+ 0x2ce3, 0x2ce4,\r
+ 0x2d00, 0x2d25,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xff41, 0xff5a,\r
+ 0x10428, 0x1044f,\r
+ 0x1d41a, 0x1d433,\r
+ 0x1d44e, 0x1d454,\r
+ 0x1d456, 0x1d467,\r
+ 0x1d482, 0x1d49b,\r
+ 0x1d4b6, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d4cf,\r
+ 0x1d4ea, 0x1d503,\r
+ 0x1d51e, 0x1d537,\r
+ 0x1d552, 0x1d56b,\r
+ 0x1d586, 0x1d59f,\r
+ 0x1d5ba, 0x1d5d3,\r
+ 0x1d5ee, 0x1d607,\r
+ 0x1d622, 0x1d63b,\r
+ 0x1d656, 0x1d66f,\r
+ 0x1d68a, 0x1d6a5,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6e1,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d71b,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d755,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d78f,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9\r
+}; /* CR_Lower */\r
+\r
+/* 'Print': [[:Print:]] */\r
+static const OnigCodePoint CR_Print[] = {\r
+ 423,\r
+ 0x0009, 0x000d,\r
+ 0x0020, 0x007e,\r
+ 0x0085, 0x0085,\r
+ 0x00a0, 0x0241,\r
+ 0x0250, 0x036f,\r
+ 0x0374, 0x0375,\r
+ 0x037a, 0x037a,\r
+ 0x037e, 0x037e,\r
+ 0x0384, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x055f,\r
+ 0x0561, 0x0587,\r
+ 0x0589, 0x058a,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f4,\r
+ 0x0600, 0x0603,\r
+ 0x060b, 0x0615,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x0660, 0x070d,\r
+ 0x070f, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0970,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09fa,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0af1, 0x0af1,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bfa,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df4,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e3f, 0x0e5b,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fbe, 0x0fcc,\r
+ 0x0fcf, 0x0fd1,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x137c,\r
+ 0x1380, 0x1399,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x1676,\r
+ 0x1680, 0x169c,\r
+ 0x16a0, 0x16f0,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1736,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x1800, 0x180e,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1940, 0x1940,\r
+ 0x1944, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x19de, 0x1a1b,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fc4,\r
+ 0x1fc6, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fdd, 0x1fef,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffe,\r
+ 0x2000, 0x2063,\r
+ 0x206a, 0x2071,\r
+ 0x2074, 0x208e,\r
+ 0x2090, 0x2094,\r
+ 0x20a0, 0x20b5,\r
+ 0x20d0, 0x20eb,\r
+ 0x2100, 0x214c,\r
+ 0x2153, 0x2183,\r
+ 0x2190, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x2460, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x27c0, 0x27c6,\r
+ 0x27d0, 0x27eb,\r
+ 0x27f0, 0x2b13,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2cea,\r
+ 0x2cf9, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3000, 0x303f,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x3190, 0x31b7,\r
+ 0x31c0, 0x31cf,\r
+ 0x31f0, 0x321e,\r
+ 0x3220, 0x3243,\r
+ 0x3250, 0x32fe,\r
+ 0x3300, 0x4db5,\r
+ 0x4dc0, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa490, 0xa4c6,\r
+ 0xa700, 0xa716,\r
+ 0xa800, 0xa82b,\r
+ 0xac00, 0xd7a3,\r
+ 0xe000, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3f,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfd,\r
+ 0xfe00, 0xfe19,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe66,\r
+ 0xfe68, 0xfe6b,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xfeff, 0xfeff,\r
+ 0xff01, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0xffe0, 0xffe6,\r
+ 0xffe8, 0xffee,\r
+ 0xfff9, 0xfffd,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10100, 0x10102,\r
+ 0x10107, 0x10133,\r
+ 0x10137, 0x1018a,\r
+ 0x10300, 0x1031e,\r
+ 0x10320, 0x10323,\r
+ 0x10330, 0x1034a,\r
+ 0x10380, 0x1039d,\r
+ 0x1039f, 0x103c3,\r
+ 0x103c8, 0x103d5,\r
+ 0x10400, 0x1049d,\r
+ 0x104a0, 0x104a9,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a47,\r
+ 0x10a50, 0x10a58,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d1dd,\r
+ 0x1d200, 0x1d245,\r
+ 0x1d300, 0x1d356,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f,\r
+ 0xe0100, 0xe01ef,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Print */\r
+\r
+/* 'Punct': [[:Punct:]] */\r
+static const OnigCodePoint CR_Punct[] = {\r
+ 96,\r
+ 0x0021, 0x0023,\r
+ 0x0025, 0x002a,\r
+ 0x002c, 0x002f,\r
+ 0x003a, 0x003b,\r
+ 0x003f, 0x0040,\r
+ 0x005b, 0x005d,\r
+ 0x005f, 0x005f,\r
+ 0x007b, 0x007b,\r
+ 0x007d, 0x007d,\r
+ 0x00a1, 0x00a1,\r
+ 0x00ab, 0x00ab,\r
+ 0x00b7, 0x00b7,\r
+ 0x00bb, 0x00bb,\r
+ 0x00bf, 0x00bf,\r
+ 0x037e, 0x037e,\r
+ 0x0387, 0x0387,\r
+ 0x055a, 0x055f,\r
+ 0x0589, 0x058a,\r
+ 0x05be, 0x05be,\r
+ 0x05c0, 0x05c0,\r
+ 0x05c3, 0x05c3,\r
+ 0x05c6, 0x05c6,\r
+ 0x05f3, 0x05f4,\r
+ 0x060c, 0x060d,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x066a, 0x066d,\r
+ 0x06d4, 0x06d4,\r
+ 0x0700, 0x070d,\r
+ 0x0964, 0x0965,\r
+ 0x0970, 0x0970,\r
+ 0x0df4, 0x0df4,\r
+ 0x0e4f, 0x0e4f,\r
+ 0x0e5a, 0x0e5b,\r
+ 0x0f04, 0x0f12,\r
+ 0x0f3a, 0x0f3d,\r
+ 0x0f85, 0x0f85,\r
+ 0x0fd0, 0x0fd1,\r
+ 0x104a, 0x104f,\r
+ 0x10fb, 0x10fb,\r
+ 0x1361, 0x1368,\r
+ 0x166d, 0x166e,\r
+ 0x169b, 0x169c,\r
+ 0x16eb, 0x16ed,\r
+ 0x1735, 0x1736,\r
+ 0x17d4, 0x17d6,\r
+ 0x17d8, 0x17da,\r
+ 0x1800, 0x180a,\r
+ 0x1944, 0x1945,\r
+ 0x19de, 0x19df,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x2010, 0x2027,\r
+ 0x2030, 0x2043,\r
+ 0x2045, 0x2051,\r
+ 0x2053, 0x205e,\r
+ 0x207d, 0x207e,\r
+ 0x208d, 0x208e,\r
+ 0x2329, 0x232a,\r
+ 0x23b4, 0x23b6,\r
+ 0x2768, 0x2775,\r
+ 0x27c5, 0x27c6,\r
+ 0x27e6, 0x27eb,\r
+ 0x2983, 0x2998,\r
+ 0x29d8, 0x29db,\r
+ 0x29fc, 0x29fd,\r
+ 0x2cf9, 0x2cfc,\r
+ 0x2cfe, 0x2cff,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x3001, 0x3003,\r
+ 0x3008, 0x3011,\r
+ 0x3014, 0x301f,\r
+ 0x3030, 0x3030,\r
+ 0x303d, 0x303d,\r
+ 0x30a0, 0x30a0,\r
+ 0x30fb, 0x30fb,\r
+ 0xfd3e, 0xfd3f,\r
+ 0xfe10, 0xfe19,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe61,\r
+ 0xfe63, 0xfe63,\r
+ 0xfe68, 0xfe68,\r
+ 0xfe6a, 0xfe6b,\r
+ 0xff01, 0xff03,\r
+ 0xff05, 0xff0a,\r
+ 0xff0c, 0xff0f,\r
+ 0xff1a, 0xff1b,\r
+ 0xff1f, 0xff20,\r
+ 0xff3b, 0xff3d,\r
+ 0xff3f, 0xff3f,\r
+ 0xff5b, 0xff5b,\r
+ 0xff5d, 0xff5d,\r
+ 0xff5f, 0xff65,\r
+ 0x10100, 0x10101,\r
+ 0x1039f, 0x1039f,\r
+ 0x10a50, 0x10a58\r
+}; /* CR_Punct */\r
+\r
+/* 'Space': [[:Space:]] */\r
+static const OnigCodePoint CR_Space[] = {\r
+ 11,\r
+ 0x0009, 0x000d,\r
+ 0x0020, 0x0020,\r
+ 0x0085, 0x0085,\r
+ 0x00a0, 0x00a0,\r
+ 0x1680, 0x1680,\r
+ 0x180e, 0x180e,\r
+ 0x2000, 0x200a,\r
+ 0x2028, 0x2029,\r
+ 0x202f, 0x202f,\r
+ 0x205f, 0x205f,\r
+ 0x3000, 0x3000\r
+}; /* CR_Space */\r
+\r
+/* 'Upper': [[:Upper:]] */\r
+static const OnigCodePoint CR_Upper[] = {\r
+ 476,\r
+ 0x0041, 0x005a,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00de,\r
+ 0x0100, 0x0100,\r
+ 0x0102, 0x0102,\r
+ 0x0104, 0x0104,\r
+ 0x0106, 0x0106,\r
+ 0x0108, 0x0108,\r
+ 0x010a, 0x010a,\r
+ 0x010c, 0x010c,\r
+ 0x010e, 0x010e,\r
+ 0x0110, 0x0110,\r
+ 0x0112, 0x0112,\r
+ 0x0114, 0x0114,\r
+ 0x0116, 0x0116,\r
+ 0x0118, 0x0118,\r
+ 0x011a, 0x011a,\r
+ 0x011c, 0x011c,\r
+ 0x011e, 0x011e,\r
+ 0x0120, 0x0120,\r
+ 0x0122, 0x0122,\r
+ 0x0124, 0x0124,\r
+ 0x0126, 0x0126,\r
+ 0x0128, 0x0128,\r
+ 0x012a, 0x012a,\r
+ 0x012c, 0x012c,\r
+ 0x012e, 0x012e,\r
+ 0x0130, 0x0130,\r
+ 0x0132, 0x0132,\r
+ 0x0134, 0x0134,\r
+ 0x0136, 0x0136,\r
+ 0x0139, 0x0139,\r
+ 0x013b, 0x013b,\r
+ 0x013d, 0x013d,\r
+ 0x013f, 0x013f,\r
+ 0x0141, 0x0141,\r
+ 0x0143, 0x0143,\r
+ 0x0145, 0x0145,\r
+ 0x0147, 0x0147,\r
+ 0x014a, 0x014a,\r
+ 0x014c, 0x014c,\r
+ 0x014e, 0x014e,\r
+ 0x0150, 0x0150,\r
+ 0x0152, 0x0152,\r
+ 0x0154, 0x0154,\r
+ 0x0156, 0x0156,\r
+ 0x0158, 0x0158,\r
+ 0x015a, 0x015a,\r
+ 0x015c, 0x015c,\r
+ 0x015e, 0x015e,\r
+ 0x0160, 0x0160,\r
+ 0x0162, 0x0162,\r
+ 0x0164, 0x0164,\r
+ 0x0166, 0x0166,\r
+ 0x0168, 0x0168,\r
+ 0x016a, 0x016a,\r
+ 0x016c, 0x016c,\r
+ 0x016e, 0x016e,\r
+ 0x0170, 0x0170,\r
+ 0x0172, 0x0172,\r
+ 0x0174, 0x0174,\r
+ 0x0176, 0x0176,\r
+ 0x0178, 0x0179,\r
+ 0x017b, 0x017b,\r
+ 0x017d, 0x017d,\r
+ 0x0181, 0x0182,\r
+ 0x0184, 0x0184,\r
+ 0x0186, 0x0187,\r
+ 0x0189, 0x018b,\r
+ 0x018e, 0x0191,\r
+ 0x0193, 0x0194,\r
+ 0x0196, 0x0198,\r
+ 0x019c, 0x019d,\r
+ 0x019f, 0x01a0,\r
+ 0x01a2, 0x01a2,\r
+ 0x01a4, 0x01a4,\r
+ 0x01a6, 0x01a7,\r
+ 0x01a9, 0x01a9,\r
+ 0x01ac, 0x01ac,\r
+ 0x01ae, 0x01af,\r
+ 0x01b1, 0x01b3,\r
+ 0x01b5, 0x01b5,\r
+ 0x01b7, 0x01b8,\r
+ 0x01bc, 0x01bc,\r
+ 0x01c4, 0x01c4,\r
+ 0x01c7, 0x01c7,\r
+ 0x01ca, 0x01ca,\r
+ 0x01cd, 0x01cd,\r
+ 0x01cf, 0x01cf,\r
+ 0x01d1, 0x01d1,\r
+ 0x01d3, 0x01d3,\r
+ 0x01d5, 0x01d5,\r
+ 0x01d7, 0x01d7,\r
+ 0x01d9, 0x01d9,\r
+ 0x01db, 0x01db,\r
+ 0x01de, 0x01de,\r
+ 0x01e0, 0x01e0,\r
+ 0x01e2, 0x01e2,\r
+ 0x01e4, 0x01e4,\r
+ 0x01e6, 0x01e6,\r
+ 0x01e8, 0x01e8,\r
+ 0x01ea, 0x01ea,\r
+ 0x01ec, 0x01ec,\r
+ 0x01ee, 0x01ee,\r
+ 0x01f1, 0x01f1,\r
+ 0x01f4, 0x01f4,\r
+ 0x01f6, 0x01f8,\r
+ 0x01fa, 0x01fa,\r
+ 0x01fc, 0x01fc,\r
+ 0x01fe, 0x01fe,\r
+ 0x0200, 0x0200,\r
+ 0x0202, 0x0202,\r
+ 0x0204, 0x0204,\r
+ 0x0206, 0x0206,\r
+ 0x0208, 0x0208,\r
+ 0x020a, 0x020a,\r
+ 0x020c, 0x020c,\r
+ 0x020e, 0x020e,\r
+ 0x0210, 0x0210,\r
+ 0x0212, 0x0212,\r
+ 0x0214, 0x0214,\r
+ 0x0216, 0x0216,\r
+ 0x0218, 0x0218,\r
+ 0x021a, 0x021a,\r
+ 0x021c, 0x021c,\r
+ 0x021e, 0x021e,\r
+ 0x0220, 0x0220,\r
+ 0x0222, 0x0222,\r
+ 0x0224, 0x0224,\r
+ 0x0226, 0x0226,\r
+ 0x0228, 0x0228,\r
+ 0x022a, 0x022a,\r
+ 0x022c, 0x022c,\r
+ 0x022e, 0x022e,\r
+ 0x0230, 0x0230,\r
+ 0x0232, 0x0232,\r
+ 0x023a, 0x023b,\r
+ 0x023d, 0x023e,\r
+ 0x0241, 0x0241,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x038f,\r
+ 0x0391, 0x03a1,\r
+ 0x03a3, 0x03ab,\r
+ 0x03d2, 0x03d4,\r
+ 0x03d8, 0x03d8,\r
+ 0x03da, 0x03da,\r
+ 0x03dc, 0x03dc,\r
+ 0x03de, 0x03de,\r
+ 0x03e0, 0x03e0,\r
+ 0x03e2, 0x03e2,\r
+ 0x03e4, 0x03e4,\r
+ 0x03e6, 0x03e6,\r
+ 0x03e8, 0x03e8,\r
+ 0x03ea, 0x03ea,\r
+ 0x03ec, 0x03ec,\r
+ 0x03ee, 0x03ee,\r
+ 0x03f4, 0x03f4,\r
+ 0x03f7, 0x03f7,\r
+ 0x03f9, 0x03fa,\r
+ 0x03fd, 0x042f,\r
+ 0x0460, 0x0460,\r
+ 0x0462, 0x0462,\r
+ 0x0464, 0x0464,\r
+ 0x0466, 0x0466,\r
+ 0x0468, 0x0468,\r
+ 0x046a, 0x046a,\r
+ 0x046c, 0x046c,\r
+ 0x046e, 0x046e,\r
+ 0x0470, 0x0470,\r
+ 0x0472, 0x0472,\r
+ 0x0474, 0x0474,\r
+ 0x0476, 0x0476,\r
+ 0x0478, 0x0478,\r
+ 0x047a, 0x047a,\r
+ 0x047c, 0x047c,\r
+ 0x047e, 0x047e,\r
+ 0x0480, 0x0480,\r
+ 0x048a, 0x048a,\r
+ 0x048c, 0x048c,\r
+ 0x048e, 0x048e,\r
+ 0x0490, 0x0490,\r
+ 0x0492, 0x0492,\r
+ 0x0494, 0x0494,\r
+ 0x0496, 0x0496,\r
+ 0x0498, 0x0498,\r
+ 0x049a, 0x049a,\r
+ 0x049c, 0x049c,\r
+ 0x049e, 0x049e,\r
+ 0x04a0, 0x04a0,\r
+ 0x04a2, 0x04a2,\r
+ 0x04a4, 0x04a4,\r
+ 0x04a6, 0x04a6,\r
+ 0x04a8, 0x04a8,\r
+ 0x04aa, 0x04aa,\r
+ 0x04ac, 0x04ac,\r
+ 0x04ae, 0x04ae,\r
+ 0x04b0, 0x04b0,\r
+ 0x04b2, 0x04b2,\r
+ 0x04b4, 0x04b4,\r
+ 0x04b6, 0x04b6,\r
+ 0x04b8, 0x04b8,\r
+ 0x04ba, 0x04ba,\r
+ 0x04bc, 0x04bc,\r
+ 0x04be, 0x04be,\r
+ 0x04c0, 0x04c1,\r
+ 0x04c3, 0x04c3,\r
+ 0x04c5, 0x04c5,\r
+ 0x04c7, 0x04c7,\r
+ 0x04c9, 0x04c9,\r
+ 0x04cb, 0x04cb,\r
+ 0x04cd, 0x04cd,\r
+ 0x04d0, 0x04d0,\r
+ 0x04d2, 0x04d2,\r
+ 0x04d4, 0x04d4,\r
+ 0x04d6, 0x04d6,\r
+ 0x04d8, 0x04d8,\r
+ 0x04da, 0x04da,\r
+ 0x04dc, 0x04dc,\r
+ 0x04de, 0x04de,\r
+ 0x04e0, 0x04e0,\r
+ 0x04e2, 0x04e2,\r
+ 0x04e4, 0x04e4,\r
+ 0x04e6, 0x04e6,\r
+ 0x04e8, 0x04e8,\r
+ 0x04ea, 0x04ea,\r
+ 0x04ec, 0x04ec,\r
+ 0x04ee, 0x04ee,\r
+ 0x04f0, 0x04f0,\r
+ 0x04f2, 0x04f2,\r
+ 0x04f4, 0x04f4,\r
+ 0x04f6, 0x04f6,\r
+ 0x04f8, 0x04f8,\r
+ 0x0500, 0x0500,\r
+ 0x0502, 0x0502,\r
+ 0x0504, 0x0504,\r
+ 0x0506, 0x0506,\r
+ 0x0508, 0x0508,\r
+ 0x050a, 0x050a,\r
+ 0x050c, 0x050c,\r
+ 0x050e, 0x050e,\r
+ 0x0531, 0x0556,\r
+ 0x10a0, 0x10c5,\r
+ 0x1e00, 0x1e00,\r
+ 0x1e02, 0x1e02,\r
+ 0x1e04, 0x1e04,\r
+ 0x1e06, 0x1e06,\r
+ 0x1e08, 0x1e08,\r
+ 0x1e0a, 0x1e0a,\r
+ 0x1e0c, 0x1e0c,\r
+ 0x1e0e, 0x1e0e,\r
+ 0x1e10, 0x1e10,\r
+ 0x1e12, 0x1e12,\r
+ 0x1e14, 0x1e14,\r
+ 0x1e16, 0x1e16,\r
+ 0x1e18, 0x1e18,\r
+ 0x1e1a, 0x1e1a,\r
+ 0x1e1c, 0x1e1c,\r
+ 0x1e1e, 0x1e1e,\r
+ 0x1e20, 0x1e20,\r
+ 0x1e22, 0x1e22,\r
+ 0x1e24, 0x1e24,\r
+ 0x1e26, 0x1e26,\r
+ 0x1e28, 0x1e28,\r
+ 0x1e2a, 0x1e2a,\r
+ 0x1e2c, 0x1e2c,\r
+ 0x1e2e, 0x1e2e,\r
+ 0x1e30, 0x1e30,\r
+ 0x1e32, 0x1e32,\r
+ 0x1e34, 0x1e34,\r
+ 0x1e36, 0x1e36,\r
+ 0x1e38, 0x1e38,\r
+ 0x1e3a, 0x1e3a,\r
+ 0x1e3c, 0x1e3c,\r
+ 0x1e3e, 0x1e3e,\r
+ 0x1e40, 0x1e40,\r
+ 0x1e42, 0x1e42,\r
+ 0x1e44, 0x1e44,\r
+ 0x1e46, 0x1e46,\r
+ 0x1e48, 0x1e48,\r
+ 0x1e4a, 0x1e4a,\r
+ 0x1e4c, 0x1e4c,\r
+ 0x1e4e, 0x1e4e,\r
+ 0x1e50, 0x1e50,\r
+ 0x1e52, 0x1e52,\r
+ 0x1e54, 0x1e54,\r
+ 0x1e56, 0x1e56,\r
+ 0x1e58, 0x1e58,\r
+ 0x1e5a, 0x1e5a,\r
+ 0x1e5c, 0x1e5c,\r
+ 0x1e5e, 0x1e5e,\r
+ 0x1e60, 0x1e60,\r
+ 0x1e62, 0x1e62,\r
+ 0x1e64, 0x1e64,\r
+ 0x1e66, 0x1e66,\r
+ 0x1e68, 0x1e68,\r
+ 0x1e6a, 0x1e6a,\r
+ 0x1e6c, 0x1e6c,\r
+ 0x1e6e, 0x1e6e,\r
+ 0x1e70, 0x1e70,\r
+ 0x1e72, 0x1e72,\r
+ 0x1e74, 0x1e74,\r
+ 0x1e76, 0x1e76,\r
+ 0x1e78, 0x1e78,\r
+ 0x1e7a, 0x1e7a,\r
+ 0x1e7c, 0x1e7c,\r
+ 0x1e7e, 0x1e7e,\r
+ 0x1e80, 0x1e80,\r
+ 0x1e82, 0x1e82,\r
+ 0x1e84, 0x1e84,\r
+ 0x1e86, 0x1e86,\r
+ 0x1e88, 0x1e88,\r
+ 0x1e8a, 0x1e8a,\r
+ 0x1e8c, 0x1e8c,\r
+ 0x1e8e, 0x1e8e,\r
+ 0x1e90, 0x1e90,\r
+ 0x1e92, 0x1e92,\r
+ 0x1e94, 0x1e94,\r
+ 0x1ea0, 0x1ea0,\r
+ 0x1ea2, 0x1ea2,\r
+ 0x1ea4, 0x1ea4,\r
+ 0x1ea6, 0x1ea6,\r
+ 0x1ea8, 0x1ea8,\r
+ 0x1eaa, 0x1eaa,\r
+ 0x1eac, 0x1eac,\r
+ 0x1eae, 0x1eae,\r
+ 0x1eb0, 0x1eb0,\r
+ 0x1eb2, 0x1eb2,\r
+ 0x1eb4, 0x1eb4,\r
+ 0x1eb6, 0x1eb6,\r
+ 0x1eb8, 0x1eb8,\r
+ 0x1eba, 0x1eba,\r
+ 0x1ebc, 0x1ebc,\r
+ 0x1ebe, 0x1ebe,\r
+ 0x1ec0, 0x1ec0,\r
+ 0x1ec2, 0x1ec2,\r
+ 0x1ec4, 0x1ec4,\r
+ 0x1ec6, 0x1ec6,\r
+ 0x1ec8, 0x1ec8,\r
+ 0x1eca, 0x1eca,\r
+ 0x1ecc, 0x1ecc,\r
+ 0x1ece, 0x1ece,\r
+ 0x1ed0, 0x1ed0,\r
+ 0x1ed2, 0x1ed2,\r
+ 0x1ed4, 0x1ed4,\r
+ 0x1ed6, 0x1ed6,\r
+ 0x1ed8, 0x1ed8,\r
+ 0x1eda, 0x1eda,\r
+ 0x1edc, 0x1edc,\r
+ 0x1ede, 0x1ede,\r
+ 0x1ee0, 0x1ee0,\r
+ 0x1ee2, 0x1ee2,\r
+ 0x1ee4, 0x1ee4,\r
+ 0x1ee6, 0x1ee6,\r
+ 0x1ee8, 0x1ee8,\r
+ 0x1eea, 0x1eea,\r
+ 0x1eec, 0x1eec,\r
+ 0x1eee, 0x1eee,\r
+ 0x1ef0, 0x1ef0,\r
+ 0x1ef2, 0x1ef2,\r
+ 0x1ef4, 0x1ef4,\r
+ 0x1ef6, 0x1ef6,\r
+ 0x1ef8, 0x1ef8,\r
+ 0x1f08, 0x1f0f,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f28, 0x1f2f,\r
+ 0x1f38, 0x1f3f,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f5f,\r
+ 0x1f68, 0x1f6f,\r
+ 0x1fb8, 0x1fbb,\r
+ 0x1fc8, 0x1fcb,\r
+ 0x1fd8, 0x1fdb,\r
+ 0x1fe8, 0x1fec,\r
+ 0x1ff8, 0x1ffb,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210b, 0x210d,\r
+ 0x2110, 0x2112,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x2130, 0x2131,\r
+ 0x2133, 0x2133,\r
+ 0x213e, 0x213f,\r
+ 0x2145, 0x2145,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c80, 0x2c80,\r
+ 0x2c82, 0x2c82,\r
+ 0x2c84, 0x2c84,\r
+ 0x2c86, 0x2c86,\r
+ 0x2c88, 0x2c88,\r
+ 0x2c8a, 0x2c8a,\r
+ 0x2c8c, 0x2c8c,\r
+ 0x2c8e, 0x2c8e,\r
+ 0x2c90, 0x2c90,\r
+ 0x2c92, 0x2c92,\r
+ 0x2c94, 0x2c94,\r
+ 0x2c96, 0x2c96,\r
+ 0x2c98, 0x2c98,\r
+ 0x2c9a, 0x2c9a,\r
+ 0x2c9c, 0x2c9c,\r
+ 0x2c9e, 0x2c9e,\r
+ 0x2ca0, 0x2ca0,\r
+ 0x2ca2, 0x2ca2,\r
+ 0x2ca4, 0x2ca4,\r
+ 0x2ca6, 0x2ca6,\r
+ 0x2ca8, 0x2ca8,\r
+ 0x2caa, 0x2caa,\r
+ 0x2cac, 0x2cac,\r
+ 0x2cae, 0x2cae,\r
+ 0x2cb0, 0x2cb0,\r
+ 0x2cb2, 0x2cb2,\r
+ 0x2cb4, 0x2cb4,\r
+ 0x2cb6, 0x2cb6,\r
+ 0x2cb8, 0x2cb8,\r
+ 0x2cba, 0x2cba,\r
+ 0x2cbc, 0x2cbc,\r
+ 0x2cbe, 0x2cbe,\r
+ 0x2cc0, 0x2cc0,\r
+ 0x2cc2, 0x2cc2,\r
+ 0x2cc4, 0x2cc4,\r
+ 0x2cc6, 0x2cc6,\r
+ 0x2cc8, 0x2cc8,\r
+ 0x2cca, 0x2cca,\r
+ 0x2ccc, 0x2ccc,\r
+ 0x2cce, 0x2cce,\r
+ 0x2cd0, 0x2cd0,\r
+ 0x2cd2, 0x2cd2,\r
+ 0x2cd4, 0x2cd4,\r
+ 0x2cd6, 0x2cd6,\r
+ 0x2cd8, 0x2cd8,\r
+ 0x2cda, 0x2cda,\r
+ 0x2cdc, 0x2cdc,\r
+ 0x2cde, 0x2cde,\r
+ 0x2ce0, 0x2ce0,\r
+ 0x2ce2, 0x2ce2,\r
+ 0xff21, 0xff3a,\r
+ 0x10400, 0x10427,\r
+ 0x1d400, 0x1d419,\r
+ 0x1d434, 0x1d44d,\r
+ 0x1d468, 0x1d481,\r
+ 0x1d49c, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b5,\r
+ 0x1d4d0, 0x1d4e9,\r
+ 0x1d504, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d538, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d56c, 0x1d585,\r
+ 0x1d5a0, 0x1d5b9,\r
+ 0x1d5d4, 0x1d5ed,\r
+ 0x1d608, 0x1d621,\r
+ 0x1d63c, 0x1d655,\r
+ 0x1d670, 0x1d689,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6e2, 0x1d6fa,\r
+ 0x1d71c, 0x1d734,\r
+ 0x1d756, 0x1d76e,\r
+ 0x1d790, 0x1d7a8\r
+}; /* CR_Upper */\r
+\r
+/* 'XDigit': [[:XDigit:]] */\r
+static const OnigCodePoint CR_XDigit[] = {\r
+ 3,\r
+ 0x0030, 0x0039,\r
+ 0x0041, 0x0046,\r
+ 0x0061, 0x0066\r
+}; /* CR_XDigit */\r
+\r
+/* 'Word': [[:Word:]] */\r
+static const OnigCodePoint CR_Word[] = {\r
+ 464,\r
+ 0x0030, 0x0039,\r
+ 0x0041, 0x005a,\r
+ 0x005f, 0x005f,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b2, 0x00b3,\r
+ 0x00b5, 0x00b5,\r
+ 0x00b9, 0x00ba,\r
+ 0x00bc, 0x00be,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00f6,\r
+ 0x00f8, 0x0241,\r
+ 0x0250, 0x02c1,\r
+ 0x02c6, 0x02d1,\r
+ 0x02e0, 0x02e4,\r
+ 0x02ee, 0x02ee,\r
+ 0x0300, 0x036f,\r
+ 0x037a, 0x037a,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x03f5,\r
+ 0x03f7, 0x0481,\r
+ 0x0483, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x0559,\r
+ 0x0561, 0x0587,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05bd,\r
+ 0x05bf, 0x05bf,\r
+ 0x05c1, 0x05c2,\r
+ 0x05c4, 0x05c5,\r
+ 0x05c7, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f2,\r
+ 0x0610, 0x0615,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x0660, 0x0669,\r
+ 0x066e, 0x06d3,\r
+ 0x06d5, 0x06dc,\r
+ 0x06de, 0x06e8,\r
+ 0x06ea, 0x06fc,\r
+ 0x06ff, 0x06ff,\r
+ 0x0710, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0963,\r
+ 0x0966, 0x096f,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09f1,\r
+ 0x09f4, 0x09f9,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b6f,\r
+ 0x0b71, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bf2,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df3,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e40, 0x0e4e,\r
+ 0x0e50, 0x0e59,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f00,\r
+ 0x0f18, 0x0f19,\r
+ 0x0f20, 0x0f33,\r
+ 0x0f35, 0x0f35,\r
+ 0x0f37, 0x0f37,\r
+ 0x0f39, 0x0f39,\r
+ 0x0f3e, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f84,\r
+ 0x0f86, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fc6, 0x0fc6,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1049,\r
+ 0x1050, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fa,\r
+ 0x10fc, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x135f,\r
+ 0x1369, 0x137c,\r
+ 0x1380, 0x138f,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x166c,\r
+ 0x166f, 0x1676,\r
+ 0x1681, 0x169a,\r
+ 0x16a0, 0x16ea,\r
+ 0x16ee, 0x16f0,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1734,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17b3,\r
+ 0x17b6, 0x17d3,\r
+ 0x17d7, 0x17d7,\r
+ 0x17dc, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x180b, 0x180d,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1946, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x1a00, 0x1a1b,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fbc,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fcc,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fe0, 0x1fec,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffc,\r
+ 0x203f, 0x2040,\r
+ 0x2054, 0x2054,\r
+ 0x2070, 0x2071,\r
+ 0x2074, 0x2079,\r
+ 0x207f, 0x2089,\r
+ 0x2090, 0x2094,\r
+ 0x20d0, 0x20eb,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210a, 0x2113,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x212f, 0x2131,\r
+ 0x2133, 0x2139,\r
+ 0x213c, 0x213f,\r
+ 0x2145, 0x2149,\r
+ 0x2153, 0x2183,\r
+ 0x2460, 0x249b,\r
+ 0x24ea, 0x24ff,\r
+ 0x2776, 0x2793,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2ce4,\r
+ 0x2cfd, 0x2cfd,\r
+ 0x2d00, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x3005, 0x3007,\r
+ 0x3021, 0x302f,\r
+ 0x3031, 0x3035,\r
+ 0x3038, 0x303c,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x309a,\r
+ 0x309d, 0x309f,\r
+ 0x30a1, 0x30fa,\r
+ 0x30fc, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x3192, 0x3195,\r
+ 0x31a0, 0x31b7,\r
+ 0x31f0, 0x31ff,\r
+ 0x3220, 0x3229,\r
+ 0x3251, 0x325f,\r
+ 0x3280, 0x3289,\r
+ 0x32b1, 0x32bf,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa800, 0xa827,\r
+ 0xac00, 0xd7a3,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb28,\r
+ 0xfb2a, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfb,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe33, 0xfe34,\r
+ 0xfe4d, 0xfe4f,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xff10, 0xff19,\r
+ 0xff21, 0xff3a,\r
+ 0xff3f, 0xff3f,\r
+ 0xff41, 0xff5a,\r
+ 0xff66, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10107, 0x10133,\r
+ 0x10140, 0x10178,\r
+ 0x1018a, 0x1018a,\r
+ 0x10300, 0x1031e,\r
+ 0x10320, 0x10323,\r
+ 0x10330, 0x1034a,\r
+ 0x10380, 0x1039d,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103cf,\r
+ 0x103d1, 0x103d5,\r
+ 0x10400, 0x1049d,\r
+ 0x104a0, 0x104a9,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a47,\r
+ 0x1d165, 0x1d169,\r
+ 0x1d16d, 0x1d172,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0x1d242, 0x1d244,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6fa,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d734,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d76e,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d7a8,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_Word */\r
+\r
+/* 'Alnum': [[:Alnum:]] */\r
+static const OnigCodePoint CR_Alnum[] = {\r
+ 436,\r
+ 0x0030, 0x0039,\r
+ 0x0041, 0x005a,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b5, 0x00b5,\r
+ 0x00ba, 0x00ba,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00f6,\r
+ 0x00f8, 0x0241,\r
+ 0x0250, 0x02c1,\r
+ 0x02c6, 0x02d1,\r
+ 0x02e0, 0x02e4,\r
+ 0x02ee, 0x02ee,\r
+ 0x0300, 0x036f,\r
+ 0x037a, 0x037a,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x03f5,\r
+ 0x03f7, 0x0481,\r
+ 0x0483, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x0559,\r
+ 0x0561, 0x0587,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05bd,\r
+ 0x05bf, 0x05bf,\r
+ 0x05c1, 0x05c2,\r
+ 0x05c4, 0x05c5,\r
+ 0x05c7, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f2,\r
+ 0x0610, 0x0615,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x0660, 0x0669,\r
+ 0x066e, 0x06d3,\r
+ 0x06d5, 0x06dc,\r
+ 0x06de, 0x06e8,\r
+ 0x06ea, 0x06fc,\r
+ 0x06ff, 0x06ff,\r
+ 0x0710, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0963,\r
+ 0x0966, 0x096f,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09f1,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b6f,\r
+ 0x0b71, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bef,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df3,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e40, 0x0e4e,\r
+ 0x0e50, 0x0e59,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f00,\r
+ 0x0f18, 0x0f19,\r
+ 0x0f20, 0x0f29,\r
+ 0x0f35, 0x0f35,\r
+ 0x0f37, 0x0f37,\r
+ 0x0f39, 0x0f39,\r
+ 0x0f3e, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f84,\r
+ 0x0f86, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fc6, 0x0fc6,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1049,\r
+ 0x1050, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fa,\r
+ 0x10fc, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x135f,\r
+ 0x1380, 0x138f,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x166c,\r
+ 0x166f, 0x1676,\r
+ 0x1681, 0x169a,\r
+ 0x16a0, 0x16ea,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1734,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17b3,\r
+ 0x17b6, 0x17d3,\r
+ 0x17d7, 0x17d7,\r
+ 0x17dc, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x180b, 0x180d,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1946, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x1a00, 0x1a1b,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fbc,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fcc,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fe0, 0x1fec,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffc,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x2090, 0x2094,\r
+ 0x20d0, 0x20eb,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210a, 0x2113,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x212f, 0x2131,\r
+ 0x2133, 0x2139,\r
+ 0x213c, 0x213f,\r
+ 0x2145, 0x2149,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2ce4,\r
+ 0x2d00, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x3005, 0x3006,\r
+ 0x302a, 0x302f,\r
+ 0x3031, 0x3035,\r
+ 0x303b, 0x303c,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x309a,\r
+ 0x309d, 0x309f,\r
+ 0x30a1, 0x30fa,\r
+ 0x30fc, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x31a0, 0x31b7,\r
+ 0x31f0, 0x31ff,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa800, 0xa827,\r
+ 0xac00, 0xd7a3,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb28,\r
+ 0xfb2a, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfb,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xff10, 0xff19,\r
+ 0xff21, 0xff3a,\r
+ 0xff41, 0xff5a,\r
+ 0xff66, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10300, 0x1031e,\r
+ 0x10330, 0x10349,\r
+ 0x10380, 0x1039d,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103cf,\r
+ 0x10400, 0x1049d,\r
+ 0x104a0, 0x104a9,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a3f,\r
+ 0x1d165, 0x1d169,\r
+ 0x1d16d, 0x1d172,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0x1d242, 0x1d244,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6fa,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d734,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d76e,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d7a8,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_Alnum */\r
+\r
+/* 'ASCII': [[:ASCII:]] */\r
+static const OnigCodePoint CR_ASCII[] = {\r
+ 1,\r
+ 0x0000, 0x007f\r
+}; /* CR_ASCII */\r
+\r
+#ifdef USE_UNICODE_PROPERTIES\r
+\r
+/* 'Any': - */\r
+static const OnigCodePoint CR_Any[] = {\r
+ 1,\r
+ 0x0000, 0x10ffff\r
+}; /* CR_Any */\r
+\r
+/* 'Assigned': - */\r
+static const OnigCodePoint CR_Assigned[] = {\r
+ 420,\r
+ 0x0000, 0x0241,\r
+ 0x0250, 0x036f,\r
+ 0x0374, 0x0375,\r
+ 0x037a, 0x037a,\r
+ 0x037e, 0x037e,\r
+ 0x0384, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x055f,\r
+ 0x0561, 0x0587,\r
+ 0x0589, 0x058a,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f4,\r
+ 0x0600, 0x0603,\r
+ 0x060b, 0x0615,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x065e,\r
+ 0x0660, 0x070d,\r
+ 0x070f, 0x074a,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07b1,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0970,\r
+ 0x097d, 0x097d,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09fa,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0af1, 0x0af1,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b71,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bfa,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df4,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e3f, 0x0e5b,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fbe, 0x0fcc,\r
+ 0x0fcf, 0x0fd1,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1059,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x137c,\r
+ 0x1380, 0x1399,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x1676,\r
+ 0x1680, 0x169c,\r
+ 0x16a0, 0x16f0,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714,\r
+ 0x1720, 0x1736,\r
+ 0x1740, 0x1753,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773,\r
+ 0x1780, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x1800, 0x180e,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1940, 0x1940,\r
+ 0x1944, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x19de, 0x1a1b,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x1d00, 0x1dc3,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fc4,\r
+ 0x1fc6, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fdd, 0x1fef,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffe,\r
+ 0x2000, 0x2063,\r
+ 0x206a, 0x2071,\r
+ 0x2074, 0x208e,\r
+ 0x2090, 0x2094,\r
+ 0x20a0, 0x20b5,\r
+ 0x20d0, 0x20eb,\r
+ 0x2100, 0x214c,\r
+ 0x2153, 0x2183,\r
+ 0x2190, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x2460, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x27c0, 0x27c6,\r
+ 0x27d0, 0x27eb,\r
+ 0x27f0, 0x2b13,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2cea,\r
+ 0x2cf9, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3000, 0x303f,\r
+ 0x3041, 0x3096,\r
+ 0x3099, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x3190, 0x31b7,\r
+ 0x31c0, 0x31cf,\r
+ 0x31f0, 0x321e,\r
+ 0x3220, 0x3243,\r
+ 0x3250, 0x32fe,\r
+ 0x3300, 0x4db5,\r
+ 0x4dc0, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa490, 0xa4c6,\r
+ 0xa700, 0xa716,\r
+ 0xa800, 0xa82b,\r
+ 0xac00, 0xd7a3,\r
+ 0xd800, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3f,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfd,\r
+ 0xfe00, 0xfe19,\r
+ 0xfe20, 0xfe23,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe66,\r
+ 0xfe68, 0xfe6b,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xfeff, 0xfeff,\r
+ 0xff01, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0xffe0, 0xffe6,\r
+ 0xffe8, 0xffee,\r
+ 0xfff9, 0xfffd,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10100, 0x10102,\r
+ 0x10107, 0x10133,\r
+ 0x10137, 0x1018a,\r
+ 0x10300, 0x1031e,\r
+ 0x10320, 0x10323,\r
+ 0x10330, 0x1034a,\r
+ 0x10380, 0x1039d,\r
+ 0x1039f, 0x103c3,\r
+ 0x103c8, 0x103d5,\r
+ 0x10400, 0x1049d,\r
+ 0x104a0, 0x104a9,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a47,\r
+ 0x10a50, 0x10a58,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d1dd,\r
+ 0x1d200, 0x1d245,\r
+ 0x1d300, 0x1d356,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f,\r
+ 0xe0100, 0xe01ef,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Assigned */\r
+\r
+/* 'C': Major Category */\r
+static const OnigCodePoint CR_C[] = {\r
+ 422,\r
+ 0x0000, 0x001f,\r
+ 0x007f, 0x009f,\r
+ 0x00ad, 0x00ad,\r
+ 0x0242, 0x024f,\r
+ 0x0370, 0x0373,\r
+ 0x0376, 0x0379,\r
+ 0x037b, 0x037d,\r
+ 0x037f, 0x0383,\r
+ 0x038b, 0x038b,\r
+ 0x038d, 0x038d,\r
+ 0x03a2, 0x03a2,\r
+ 0x03cf, 0x03cf,\r
+ 0x0487, 0x0487,\r
+ 0x04cf, 0x04cf,\r
+ 0x04fa, 0x04ff,\r
+ 0x0510, 0x0530,\r
+ 0x0557, 0x0558,\r
+ 0x0560, 0x0560,\r
+ 0x0588, 0x0588,\r
+ 0x058b, 0x0590,\r
+ 0x05ba, 0x05ba,\r
+ 0x05c8, 0x05cf,\r
+ 0x05eb, 0x05ef,\r
+ 0x05f5, 0x060a,\r
+ 0x0616, 0x061a,\r
+ 0x061c, 0x061d,\r
+ 0x0620, 0x0620,\r
+ 0x063b, 0x063f,\r
+ 0x065f, 0x065f,\r
+ 0x06dd, 0x06dd,\r
+ 0x070e, 0x070f,\r
+ 0x074b, 0x074c,\r
+ 0x076e, 0x077f,\r
+ 0x07b2, 0x0900,\r
+ 0x093a, 0x093b,\r
+ 0x094e, 0x094f,\r
+ 0x0955, 0x0957,\r
+ 0x0971, 0x097c,\r
+ 0x097e, 0x0980,\r
+ 0x0984, 0x0984,\r
+ 0x098d, 0x098e,\r
+ 0x0991, 0x0992,\r
+ 0x09a9, 0x09a9,\r
+ 0x09b1, 0x09b1,\r
+ 0x09b3, 0x09b5,\r
+ 0x09ba, 0x09bb,\r
+ 0x09c5, 0x09c6,\r
+ 0x09c9, 0x09ca,\r
+ 0x09cf, 0x09d6,\r
+ 0x09d8, 0x09db,\r
+ 0x09de, 0x09de,\r
+ 0x09e4, 0x09e5,\r
+ 0x09fb, 0x0a00,\r
+ 0x0a04, 0x0a04,\r
+ 0x0a0b, 0x0a0e,\r
+ 0x0a11, 0x0a12,\r
+ 0x0a29, 0x0a29,\r
+ 0x0a31, 0x0a31,\r
+ 0x0a34, 0x0a34,\r
+ 0x0a37, 0x0a37,\r
+ 0x0a3a, 0x0a3b,\r
+ 0x0a3d, 0x0a3d,\r
+ 0x0a43, 0x0a46,\r
+ 0x0a49, 0x0a4a,\r
+ 0x0a4e, 0x0a58,\r
+ 0x0a5d, 0x0a5d,\r
+ 0x0a5f, 0x0a65,\r
+ 0x0a75, 0x0a80,\r
+ 0x0a84, 0x0a84,\r
+ 0x0a8e, 0x0a8e,\r
+ 0x0a92, 0x0a92,\r
+ 0x0aa9, 0x0aa9,\r
+ 0x0ab1, 0x0ab1,\r
+ 0x0ab4, 0x0ab4,\r
+ 0x0aba, 0x0abb,\r
+ 0x0ac6, 0x0ac6,\r
+ 0x0aca, 0x0aca,\r
+ 0x0ace, 0x0acf,\r
+ 0x0ad1, 0x0adf,\r
+ 0x0ae4, 0x0ae5,\r
+ 0x0af0, 0x0af0,\r
+ 0x0af2, 0x0b00,\r
+ 0x0b04, 0x0b04,\r
+ 0x0b0d, 0x0b0e,\r
+ 0x0b11, 0x0b12,\r
+ 0x0b29, 0x0b29,\r
+ 0x0b31, 0x0b31,\r
+ 0x0b34, 0x0b34,\r
+ 0x0b3a, 0x0b3b,\r
+ 0x0b44, 0x0b46,\r
+ 0x0b49, 0x0b4a,\r
+ 0x0b4e, 0x0b55,\r
+ 0x0b58, 0x0b5b,\r
+ 0x0b5e, 0x0b5e,\r
+ 0x0b62, 0x0b65,\r
+ 0x0b72, 0x0b81,\r
+ 0x0b84, 0x0b84,\r
+ 0x0b8b, 0x0b8d,\r
+ 0x0b91, 0x0b91,\r
+ 0x0b96, 0x0b98,\r
+ 0x0b9b, 0x0b9b,\r
+ 0x0b9d, 0x0b9d,\r
+ 0x0ba0, 0x0ba2,\r
+ 0x0ba5, 0x0ba7,\r
+ 0x0bab, 0x0bad,\r
+ 0x0bba, 0x0bbd,\r
+ 0x0bc3, 0x0bc5,\r
+ 0x0bc9, 0x0bc9,\r
+ 0x0bce, 0x0bd6,\r
+ 0x0bd8, 0x0be5,\r
+ 0x0bfb, 0x0c00,\r
+ 0x0c04, 0x0c04,\r
+ 0x0c0d, 0x0c0d,\r
+ 0x0c11, 0x0c11,\r
+ 0x0c29, 0x0c29,\r
+ 0x0c34, 0x0c34,\r
+ 0x0c3a, 0x0c3d,\r
+ 0x0c45, 0x0c45,\r
+ 0x0c49, 0x0c49,\r
+ 0x0c4e, 0x0c54,\r
+ 0x0c57, 0x0c5f,\r
+ 0x0c62, 0x0c65,\r
+ 0x0c70, 0x0c81,\r
+ 0x0c84, 0x0c84,\r
+ 0x0c8d, 0x0c8d,\r
+ 0x0c91, 0x0c91,\r
+ 0x0ca9, 0x0ca9,\r
+ 0x0cb4, 0x0cb4,\r
+ 0x0cba, 0x0cbb,\r
+ 0x0cc5, 0x0cc5,\r
+ 0x0cc9, 0x0cc9,\r
+ 0x0cce, 0x0cd4,\r
+ 0x0cd7, 0x0cdd,\r
+ 0x0cdf, 0x0cdf,\r
+ 0x0ce2, 0x0ce5,\r
+ 0x0cf0, 0x0d01,\r
+ 0x0d04, 0x0d04,\r
+ 0x0d0d, 0x0d0d,\r
+ 0x0d11, 0x0d11,\r
+ 0x0d29, 0x0d29,\r
+ 0x0d3a, 0x0d3d,\r
+ 0x0d44, 0x0d45,\r
+ 0x0d49, 0x0d49,\r
+ 0x0d4e, 0x0d56,\r
+ 0x0d58, 0x0d5f,\r
+ 0x0d62, 0x0d65,\r
+ 0x0d70, 0x0d81,\r
+ 0x0d84, 0x0d84,\r
+ 0x0d97, 0x0d99,\r
+ 0x0db2, 0x0db2,\r
+ 0x0dbc, 0x0dbc,\r
+ 0x0dbe, 0x0dbf,\r
+ 0x0dc7, 0x0dc9,\r
+ 0x0dcb, 0x0dce,\r
+ 0x0dd5, 0x0dd5,\r
+ 0x0dd7, 0x0dd7,\r
+ 0x0de0, 0x0df1,\r
+ 0x0df5, 0x0e00,\r
+ 0x0e3b, 0x0e3e,\r
+ 0x0e5c, 0x0e80,\r
+ 0x0e83, 0x0e83,\r
+ 0x0e85, 0x0e86,\r
+ 0x0e89, 0x0e89,\r
+ 0x0e8b, 0x0e8c,\r
+ 0x0e8e, 0x0e93,\r
+ 0x0e98, 0x0e98,\r
+ 0x0ea0, 0x0ea0,\r
+ 0x0ea4, 0x0ea4,\r
+ 0x0ea6, 0x0ea6,\r
+ 0x0ea8, 0x0ea9,\r
+ 0x0eac, 0x0eac,\r
+ 0x0eba, 0x0eba,\r
+ 0x0ebe, 0x0ebf,\r
+ 0x0ec5, 0x0ec5,\r
+ 0x0ec7, 0x0ec7,\r
+ 0x0ece, 0x0ecf,\r
+ 0x0eda, 0x0edb,\r
+ 0x0ede, 0x0eff,\r
+ 0x0f48, 0x0f48,\r
+ 0x0f6b, 0x0f70,\r
+ 0x0f8c, 0x0f8f,\r
+ 0x0f98, 0x0f98,\r
+ 0x0fbd, 0x0fbd,\r
+ 0x0fcd, 0x0fce,\r
+ 0x0fd2, 0x0fff,\r
+ 0x1022, 0x1022,\r
+ 0x1028, 0x1028,\r
+ 0x102b, 0x102b,\r
+ 0x1033, 0x1035,\r
+ 0x103a, 0x103f,\r
+ 0x105a, 0x109f,\r
+ 0x10c6, 0x10cf,\r
+ 0x10fd, 0x10ff,\r
+ 0x115a, 0x115e,\r
+ 0x11a3, 0x11a7,\r
+ 0x11fa, 0x11ff,\r
+ 0x1249, 0x1249,\r
+ 0x124e, 0x124f,\r
+ 0x1257, 0x1257,\r
+ 0x1259, 0x1259,\r
+ 0x125e, 0x125f,\r
+ 0x1289, 0x1289,\r
+ 0x128e, 0x128f,\r
+ 0x12b1, 0x12b1,\r
+ 0x12b6, 0x12b7,\r
+ 0x12bf, 0x12bf,\r
+ 0x12c1, 0x12c1,\r
+ 0x12c6, 0x12c7,\r
+ 0x12d7, 0x12d7,\r
+ 0x1311, 0x1311,\r
+ 0x1316, 0x1317,\r
+ 0x135b, 0x135e,\r
+ 0x137d, 0x137f,\r
+ 0x139a, 0x139f,\r
+ 0x13f5, 0x1400,\r
+ 0x1677, 0x167f,\r
+ 0x169d, 0x169f,\r
+ 0x16f1, 0x16ff,\r
+ 0x170d, 0x170d,\r
+ 0x1715, 0x171f,\r
+ 0x1737, 0x173f,\r
+ 0x1754, 0x175f,\r
+ 0x176d, 0x176d,\r
+ 0x1771, 0x1771,\r
+ 0x1774, 0x177f,\r
+ 0x17b4, 0x17b5,\r
+ 0x17de, 0x17df,\r
+ 0x17ea, 0x17ef,\r
+ 0x17fa, 0x17ff,\r
+ 0x180f, 0x180f,\r
+ 0x181a, 0x181f,\r
+ 0x1878, 0x187f,\r
+ 0x18aa, 0x18ff,\r
+ 0x191d, 0x191f,\r
+ 0x192c, 0x192f,\r
+ 0x193c, 0x193f,\r
+ 0x1941, 0x1943,\r
+ 0x196e, 0x196f,\r
+ 0x1975, 0x197f,\r
+ 0x19aa, 0x19af,\r
+ 0x19ca, 0x19cf,\r
+ 0x19da, 0x19dd,\r
+ 0x1a1c, 0x1a1d,\r
+ 0x1a20, 0x1cff,\r
+ 0x1dc4, 0x1dff,\r
+ 0x1e9c, 0x1e9f,\r
+ 0x1efa, 0x1eff,\r
+ 0x1f16, 0x1f17,\r
+ 0x1f1e, 0x1f1f,\r
+ 0x1f46, 0x1f47,\r
+ 0x1f4e, 0x1f4f,\r
+ 0x1f58, 0x1f58,\r
+ 0x1f5a, 0x1f5a,\r
+ 0x1f5c, 0x1f5c,\r
+ 0x1f5e, 0x1f5e,\r
+ 0x1f7e, 0x1f7f,\r
+ 0x1fb5, 0x1fb5,\r
+ 0x1fc5, 0x1fc5,\r
+ 0x1fd4, 0x1fd5,\r
+ 0x1fdc, 0x1fdc,\r
+ 0x1ff0, 0x1ff1,\r
+ 0x1ff5, 0x1ff5,\r
+ 0x1fff, 0x1fff,\r
+ 0x200b, 0x200f,\r
+ 0x202a, 0x202e,\r
+ 0x2060, 0x206f,\r
+ 0x2072, 0x2073,\r
+ 0x208f, 0x208f,\r
+ 0x2095, 0x209f,\r
+ 0x20b6, 0x20cf,\r
+ 0x20ec, 0x20ff,\r
+ 0x214d, 0x2152,\r
+ 0x2184, 0x218f,\r
+ 0x23dc, 0x23ff,\r
+ 0x2427, 0x243f,\r
+ 0x244b, 0x245f,\r
+ 0x269d, 0x269f,\r
+ 0x26b2, 0x2700,\r
+ 0x2705, 0x2705,\r
+ 0x270a, 0x270b,\r
+ 0x2728, 0x2728,\r
+ 0x274c, 0x274c,\r
+ 0x274e, 0x274e,\r
+ 0x2753, 0x2755,\r
+ 0x2757, 0x2757,\r
+ 0x275f, 0x2760,\r
+ 0x2795, 0x2797,\r
+ 0x27b0, 0x27b0,\r
+ 0x27bf, 0x27bf,\r
+ 0x27c7, 0x27cf,\r
+ 0x27ec, 0x27ef,\r
+ 0x2b14, 0x2bff,\r
+ 0x2c2f, 0x2c2f,\r
+ 0x2c5f, 0x2c7f,\r
+ 0x2ceb, 0x2cf8,\r
+ 0x2d26, 0x2d2f,\r
+ 0x2d66, 0x2d6e,\r
+ 0x2d70, 0x2d7f,\r
+ 0x2d97, 0x2d9f,\r
+ 0x2da7, 0x2da7,\r
+ 0x2daf, 0x2daf,\r
+ 0x2db7, 0x2db7,\r
+ 0x2dbf, 0x2dbf,\r
+ 0x2dc7, 0x2dc7,\r
+ 0x2dcf, 0x2dcf,\r
+ 0x2dd7, 0x2dd7,\r
+ 0x2ddf, 0x2dff,\r
+ 0x2e18, 0x2e1b,\r
+ 0x2e1e, 0x2e7f,\r
+ 0x2e9a, 0x2e9a,\r
+ 0x2ef4, 0x2eff,\r
+ 0x2fd6, 0x2fef,\r
+ 0x2ffc, 0x2fff,\r
+ 0x3040, 0x3040,\r
+ 0x3097, 0x3098,\r
+ 0x3100, 0x3104,\r
+ 0x312d, 0x3130,\r
+ 0x318f, 0x318f,\r
+ 0x31b8, 0x31bf,\r
+ 0x31d0, 0x31ef,\r
+ 0x321f, 0x321f,\r
+ 0x3244, 0x324f,\r
+ 0x32ff, 0x32ff,\r
+ 0x4db6, 0x4dbf,\r
+ 0x9fbc, 0x9fff,\r
+ 0xa48d, 0xa48f,\r
+ 0xa4c7, 0xa6ff,\r
+ 0xa717, 0xa7ff,\r
+ 0xa82c, 0xabff,\r
+ 0xd7a4, 0xf8ff,\r
+ 0xfa2e, 0xfa2f,\r
+ 0xfa6b, 0xfa6f,\r
+ 0xfada, 0xfaff,\r
+ 0xfb07, 0xfb12,\r
+ 0xfb18, 0xfb1c,\r
+ 0xfb37, 0xfb37,\r
+ 0xfb3d, 0xfb3d,\r
+ 0xfb3f, 0xfb3f,\r
+ 0xfb42, 0xfb42,\r
+ 0xfb45, 0xfb45,\r
+ 0xfbb2, 0xfbd2,\r
+ 0xfd40, 0xfd4f,\r
+ 0xfd90, 0xfd91,\r
+ 0xfdc8, 0xfdef,\r
+ 0xfdfe, 0xfdff,\r
+ 0xfe1a, 0xfe1f,\r
+ 0xfe24, 0xfe2f,\r
+ 0xfe53, 0xfe53,\r
+ 0xfe67, 0xfe67,\r
+ 0xfe6c, 0xfe6f,\r
+ 0xfe75, 0xfe75,\r
+ 0xfefd, 0xff00,\r
+ 0xffbf, 0xffc1,\r
+ 0xffc8, 0xffc9,\r
+ 0xffd0, 0xffd1,\r
+ 0xffd8, 0xffd9,\r
+ 0xffdd, 0xffdf,\r
+ 0xffe7, 0xffe7,\r
+ 0xffef, 0xfffb,\r
+ 0xfffe, 0xffff,\r
+ 0x1000c, 0x1000c,\r
+ 0x10027, 0x10027,\r
+ 0x1003b, 0x1003b,\r
+ 0x1003e, 0x1003e,\r
+ 0x1004e, 0x1004f,\r
+ 0x1005e, 0x1007f,\r
+ 0x100fb, 0x100ff,\r
+ 0x10103, 0x10106,\r
+ 0x10134, 0x10136,\r
+ 0x1018b, 0x102ff,\r
+ 0x1031f, 0x1031f,\r
+ 0x10324, 0x1032f,\r
+ 0x1034b, 0x1037f,\r
+ 0x1039e, 0x1039e,\r
+ 0x103c4, 0x103c7,\r
+ 0x103d6, 0x103ff,\r
+ 0x1049e, 0x1049f,\r
+ 0x104aa, 0x107ff,\r
+ 0x10806, 0x10807,\r
+ 0x10809, 0x10809,\r
+ 0x10836, 0x10836,\r
+ 0x10839, 0x1083b,\r
+ 0x1083d, 0x1083e,\r
+ 0x10840, 0x109ff,\r
+ 0x10a04, 0x10a04,\r
+ 0x10a07, 0x10a0b,\r
+ 0x10a14, 0x10a14,\r
+ 0x10a18, 0x10a18,\r
+ 0x10a34, 0x10a37,\r
+ 0x10a3b, 0x10a3e,\r
+ 0x10a48, 0x10a4f,\r
+ 0x10a59, 0x1cfff,\r
+ 0x1d0f6, 0x1d0ff,\r
+ 0x1d127, 0x1d129,\r
+ 0x1d173, 0x1d17a,\r
+ 0x1d1de, 0x1d1ff,\r
+ 0x1d246, 0x1d2ff,\r
+ 0x1d357, 0x1d3ff,\r
+ 0x1d455, 0x1d455,\r
+ 0x1d49d, 0x1d49d,\r
+ 0x1d4a0, 0x1d4a1,\r
+ 0x1d4a3, 0x1d4a4,\r
+ 0x1d4a7, 0x1d4a8,\r
+ 0x1d4ad, 0x1d4ad,\r
+ 0x1d4ba, 0x1d4ba,\r
+ 0x1d4bc, 0x1d4bc,\r
+ 0x1d4c4, 0x1d4c4,\r
+ 0x1d506, 0x1d506,\r
+ 0x1d50b, 0x1d50c,\r
+ 0x1d515, 0x1d515,\r
+ 0x1d51d, 0x1d51d,\r
+ 0x1d53a, 0x1d53a,\r
+ 0x1d53f, 0x1d53f,\r
+ 0x1d545, 0x1d545,\r
+ 0x1d547, 0x1d549,\r
+ 0x1d551, 0x1d551,\r
+ 0x1d6a6, 0x1d6a7,\r
+ 0x1d7ca, 0x1d7cd,\r
+ 0x1d800, 0x1ffff,\r
+ 0x2a6d7, 0x2f7ff,\r
+ 0x2fa1e, 0xe00ff,\r
+ 0xe01f0, 0x10ffff\r
+}; /* CR_C */\r
+\r
+/* 'Cc': General Category */\r
+static const OnigCodePoint CR_Cc[] = {\r
+ 2,\r
+ 0x0000, 0x001f,\r
+ 0x007f, 0x009f\r
+}; /* CR_Cc */\r
+\r
+/* 'Cf': General Category */\r
+static const OnigCodePoint CR_Cf[] = {\r
+ 14,\r
+ 0x00ad, 0x00ad,\r
+ 0x0600, 0x0603,\r
+ 0x06dd, 0x06dd,\r
+ 0x070f, 0x070f,\r
+ 0x17b4, 0x17b5,\r
+ 0x200b, 0x200f,\r
+ 0x202a, 0x202e,\r
+ 0x2060, 0x2063,\r
+ 0x206a, 0x206f,\r
+ 0xfeff, 0xfeff,\r
+ 0xfff9, 0xfffb,\r
+ 0x1d173, 0x1d17a,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f\r
+}; /* CR_Cf */\r
+\r
+/* 'Cn': General Category */\r
+static const OnigCodePoint CR_Cn[] = {\r
+ 420,\r
+ 0x0242, 0x024f,\r
+ 0x0370, 0x0373,\r
+ 0x0376, 0x0379,\r
+ 0x037b, 0x037d,\r
+ 0x037f, 0x0383,\r
+ 0x038b, 0x038b,\r
+ 0x038d, 0x038d,\r
+ 0x03a2, 0x03a2,\r
+ 0x03cf, 0x03cf,\r
+ 0x0487, 0x0487,\r
+ 0x04cf, 0x04cf,\r
+ 0x04fa, 0x04ff,\r
+ 0x0510, 0x0530,\r
+ 0x0557, 0x0558,\r
+ 0x0560, 0x0560,\r
+ 0x0588, 0x0588,\r
+ 0x058b, 0x0590,\r
+ 0x05ba, 0x05ba,\r
+ 0x05c8, 0x05cf,\r
+ 0x05eb, 0x05ef,\r
+ 0x05f5, 0x05ff,\r
+ 0x0604, 0x060a,\r
+ 0x0616, 0x061a,\r
+ 0x061c, 0x061d,\r
+ 0x0620, 0x0620,\r
+ 0x063b, 0x063f,\r
+ 0x065f, 0x065f,\r
+ 0x070e, 0x070e,\r
+ 0x074b, 0x074c,\r
+ 0x076e, 0x077f,\r
+ 0x07b2, 0x0900,\r
+ 0x093a, 0x093b,\r
+ 0x094e, 0x094f,\r
+ 0x0955, 0x0957,\r
+ 0x0971, 0x097c,\r
+ 0x097e, 0x0980,\r
+ 0x0984, 0x0984,\r
+ 0x098d, 0x098e,\r
+ 0x0991, 0x0992,\r
+ 0x09a9, 0x09a9,\r
+ 0x09b1, 0x09b1,\r
+ 0x09b3, 0x09b5,\r
+ 0x09ba, 0x09bb,\r
+ 0x09c5, 0x09c6,\r
+ 0x09c9, 0x09ca,\r
+ 0x09cf, 0x09d6,\r
+ 0x09d8, 0x09db,\r
+ 0x09de, 0x09de,\r
+ 0x09e4, 0x09e5,\r
+ 0x09fb, 0x0a00,\r
+ 0x0a04, 0x0a04,\r
+ 0x0a0b, 0x0a0e,\r
+ 0x0a11, 0x0a12,\r
+ 0x0a29, 0x0a29,\r
+ 0x0a31, 0x0a31,\r
+ 0x0a34, 0x0a34,\r
+ 0x0a37, 0x0a37,\r
+ 0x0a3a, 0x0a3b,\r
+ 0x0a3d, 0x0a3d,\r
+ 0x0a43, 0x0a46,\r
+ 0x0a49, 0x0a4a,\r
+ 0x0a4e, 0x0a58,\r
+ 0x0a5d, 0x0a5d,\r
+ 0x0a5f, 0x0a65,\r
+ 0x0a75, 0x0a80,\r
+ 0x0a84, 0x0a84,\r
+ 0x0a8e, 0x0a8e,\r
+ 0x0a92, 0x0a92,\r
+ 0x0aa9, 0x0aa9,\r
+ 0x0ab1, 0x0ab1,\r
+ 0x0ab4, 0x0ab4,\r
+ 0x0aba, 0x0abb,\r
+ 0x0ac6, 0x0ac6,\r
+ 0x0aca, 0x0aca,\r
+ 0x0ace, 0x0acf,\r
+ 0x0ad1, 0x0adf,\r
+ 0x0ae4, 0x0ae5,\r
+ 0x0af0, 0x0af0,\r
+ 0x0af2, 0x0b00,\r
+ 0x0b04, 0x0b04,\r
+ 0x0b0d, 0x0b0e,\r
+ 0x0b11, 0x0b12,\r
+ 0x0b29, 0x0b29,\r
+ 0x0b31, 0x0b31,\r
+ 0x0b34, 0x0b34,\r
+ 0x0b3a, 0x0b3b,\r
+ 0x0b44, 0x0b46,\r
+ 0x0b49, 0x0b4a,\r
+ 0x0b4e, 0x0b55,\r
+ 0x0b58, 0x0b5b,\r
+ 0x0b5e, 0x0b5e,\r
+ 0x0b62, 0x0b65,\r
+ 0x0b72, 0x0b81,\r
+ 0x0b84, 0x0b84,\r
+ 0x0b8b, 0x0b8d,\r
+ 0x0b91, 0x0b91,\r
+ 0x0b96, 0x0b98,\r
+ 0x0b9b, 0x0b9b,\r
+ 0x0b9d, 0x0b9d,\r
+ 0x0ba0, 0x0ba2,\r
+ 0x0ba5, 0x0ba7,\r
+ 0x0bab, 0x0bad,\r
+ 0x0bba, 0x0bbd,\r
+ 0x0bc3, 0x0bc5,\r
+ 0x0bc9, 0x0bc9,\r
+ 0x0bce, 0x0bd6,\r
+ 0x0bd8, 0x0be5,\r
+ 0x0bfb, 0x0c00,\r
+ 0x0c04, 0x0c04,\r
+ 0x0c0d, 0x0c0d,\r
+ 0x0c11, 0x0c11,\r
+ 0x0c29, 0x0c29,\r
+ 0x0c34, 0x0c34,\r
+ 0x0c3a, 0x0c3d,\r
+ 0x0c45, 0x0c45,\r
+ 0x0c49, 0x0c49,\r
+ 0x0c4e, 0x0c54,\r
+ 0x0c57, 0x0c5f,\r
+ 0x0c62, 0x0c65,\r
+ 0x0c70, 0x0c81,\r
+ 0x0c84, 0x0c84,\r
+ 0x0c8d, 0x0c8d,\r
+ 0x0c91, 0x0c91,\r
+ 0x0ca9, 0x0ca9,\r
+ 0x0cb4, 0x0cb4,\r
+ 0x0cba, 0x0cbb,\r
+ 0x0cc5, 0x0cc5,\r
+ 0x0cc9, 0x0cc9,\r
+ 0x0cce, 0x0cd4,\r
+ 0x0cd7, 0x0cdd,\r
+ 0x0cdf, 0x0cdf,\r
+ 0x0ce2, 0x0ce5,\r
+ 0x0cf0, 0x0d01,\r
+ 0x0d04, 0x0d04,\r
+ 0x0d0d, 0x0d0d,\r
+ 0x0d11, 0x0d11,\r
+ 0x0d29, 0x0d29,\r
+ 0x0d3a, 0x0d3d,\r
+ 0x0d44, 0x0d45,\r
+ 0x0d49, 0x0d49,\r
+ 0x0d4e, 0x0d56,\r
+ 0x0d58, 0x0d5f,\r
+ 0x0d62, 0x0d65,\r
+ 0x0d70, 0x0d81,\r
+ 0x0d84, 0x0d84,\r
+ 0x0d97, 0x0d99,\r
+ 0x0db2, 0x0db2,\r
+ 0x0dbc, 0x0dbc,\r
+ 0x0dbe, 0x0dbf,\r
+ 0x0dc7, 0x0dc9,\r
+ 0x0dcb, 0x0dce,\r
+ 0x0dd5, 0x0dd5,\r
+ 0x0dd7, 0x0dd7,\r
+ 0x0de0, 0x0df1,\r
+ 0x0df5, 0x0e00,\r
+ 0x0e3b, 0x0e3e,\r
+ 0x0e5c, 0x0e80,\r
+ 0x0e83, 0x0e83,\r
+ 0x0e85, 0x0e86,\r
+ 0x0e89, 0x0e89,\r
+ 0x0e8b, 0x0e8c,\r
+ 0x0e8e, 0x0e93,\r
+ 0x0e98, 0x0e98,\r
+ 0x0ea0, 0x0ea0,\r
+ 0x0ea4, 0x0ea4,\r
+ 0x0ea6, 0x0ea6,\r
+ 0x0ea8, 0x0ea9,\r
+ 0x0eac, 0x0eac,\r
+ 0x0eba, 0x0eba,\r
+ 0x0ebe, 0x0ebf,\r
+ 0x0ec5, 0x0ec5,\r
+ 0x0ec7, 0x0ec7,\r
+ 0x0ece, 0x0ecf,\r
+ 0x0eda, 0x0edb,\r
+ 0x0ede, 0x0eff,\r
+ 0x0f48, 0x0f48,\r
+ 0x0f6b, 0x0f70,\r
+ 0x0f8c, 0x0f8f,\r
+ 0x0f98, 0x0f98,\r
+ 0x0fbd, 0x0fbd,\r
+ 0x0fcd, 0x0fce,\r
+ 0x0fd2, 0x0fff,\r
+ 0x1022, 0x1022,\r
+ 0x1028, 0x1028,\r
+ 0x102b, 0x102b,\r
+ 0x1033, 0x1035,\r
+ 0x103a, 0x103f,\r
+ 0x105a, 0x109f,\r
+ 0x10c6, 0x10cf,\r
+ 0x10fd, 0x10ff,\r
+ 0x115a, 0x115e,\r
+ 0x11a3, 0x11a7,\r
+ 0x11fa, 0x11ff,\r
+ 0x1249, 0x1249,\r
+ 0x124e, 0x124f,\r
+ 0x1257, 0x1257,\r
+ 0x1259, 0x1259,\r
+ 0x125e, 0x125f,\r
+ 0x1289, 0x1289,\r
+ 0x128e, 0x128f,\r
+ 0x12b1, 0x12b1,\r
+ 0x12b6, 0x12b7,\r
+ 0x12bf, 0x12bf,\r
+ 0x12c1, 0x12c1,\r
+ 0x12c6, 0x12c7,\r
+ 0x12d7, 0x12d7,\r
+ 0x1311, 0x1311,\r
+ 0x1316, 0x1317,\r
+ 0x135b, 0x135e,\r
+ 0x137d, 0x137f,\r
+ 0x139a, 0x139f,\r
+ 0x13f5, 0x1400,\r
+ 0x1677, 0x167f,\r
+ 0x169d, 0x169f,\r
+ 0x16f1, 0x16ff,\r
+ 0x170d, 0x170d,\r
+ 0x1715, 0x171f,\r
+ 0x1737, 0x173f,\r
+ 0x1754, 0x175f,\r
+ 0x176d, 0x176d,\r
+ 0x1771, 0x1771,\r
+ 0x1774, 0x177f,\r
+ 0x17de, 0x17df,\r
+ 0x17ea, 0x17ef,\r
+ 0x17fa, 0x17ff,\r
+ 0x180f, 0x180f,\r
+ 0x181a, 0x181f,\r
+ 0x1878, 0x187f,\r
+ 0x18aa, 0x18ff,\r
+ 0x191d, 0x191f,\r
+ 0x192c, 0x192f,\r
+ 0x193c, 0x193f,\r
+ 0x1941, 0x1943,\r
+ 0x196e, 0x196f,\r
+ 0x1975, 0x197f,\r
+ 0x19aa, 0x19af,\r
+ 0x19ca, 0x19cf,\r
+ 0x19da, 0x19dd,\r
+ 0x1a1c, 0x1a1d,\r
+ 0x1a20, 0x1cff,\r
+ 0x1dc4, 0x1dff,\r
+ 0x1e9c, 0x1e9f,\r
+ 0x1efa, 0x1eff,\r
+ 0x1f16, 0x1f17,\r
+ 0x1f1e, 0x1f1f,\r
+ 0x1f46, 0x1f47,\r
+ 0x1f4e, 0x1f4f,\r
+ 0x1f58, 0x1f58,\r
+ 0x1f5a, 0x1f5a,\r
+ 0x1f5c, 0x1f5c,\r
+ 0x1f5e, 0x1f5e,\r
+ 0x1f7e, 0x1f7f,\r
+ 0x1fb5, 0x1fb5,\r
+ 0x1fc5, 0x1fc5,\r
+ 0x1fd4, 0x1fd5,\r
+ 0x1fdc, 0x1fdc,\r
+ 0x1ff0, 0x1ff1,\r
+ 0x1ff5, 0x1ff5,\r
+ 0x1fff, 0x1fff,\r
+ 0x2064, 0x2069,\r
+ 0x2072, 0x2073,\r
+ 0x208f, 0x208f,\r
+ 0x2095, 0x209f,\r
+ 0x20b6, 0x20cf,\r
+ 0x20ec, 0x20ff,\r
+ 0x214d, 0x2152,\r
+ 0x2184, 0x218f,\r
+ 0x23dc, 0x23ff,\r
+ 0x2427, 0x243f,\r
+ 0x244b, 0x245f,\r
+ 0x269d, 0x269f,\r
+ 0x26b2, 0x2700,\r
+ 0x2705, 0x2705,\r
+ 0x270a, 0x270b,\r
+ 0x2728, 0x2728,\r
+ 0x274c, 0x274c,\r
+ 0x274e, 0x274e,\r
+ 0x2753, 0x2755,\r
+ 0x2757, 0x2757,\r
+ 0x275f, 0x2760,\r
+ 0x2795, 0x2797,\r
+ 0x27b0, 0x27b0,\r
+ 0x27bf, 0x27bf,\r
+ 0x27c7, 0x27cf,\r
+ 0x27ec, 0x27ef,\r
+ 0x2b14, 0x2bff,\r
+ 0x2c2f, 0x2c2f,\r
+ 0x2c5f, 0x2c7f,\r
+ 0x2ceb, 0x2cf8,\r
+ 0x2d26, 0x2d2f,\r
+ 0x2d66, 0x2d6e,\r
+ 0x2d70, 0x2d7f,\r
+ 0x2d97, 0x2d9f,\r
+ 0x2da7, 0x2da7,\r
+ 0x2daf, 0x2daf,\r
+ 0x2db7, 0x2db7,\r
+ 0x2dbf, 0x2dbf,\r
+ 0x2dc7, 0x2dc7,\r
+ 0x2dcf, 0x2dcf,\r
+ 0x2dd7, 0x2dd7,\r
+ 0x2ddf, 0x2dff,\r
+ 0x2e18, 0x2e1b,\r
+ 0x2e1e, 0x2e7f,\r
+ 0x2e9a, 0x2e9a,\r
+ 0x2ef4, 0x2eff,\r
+ 0x2fd6, 0x2fef,\r
+ 0x2ffc, 0x2fff,\r
+ 0x3040, 0x3040,\r
+ 0x3097, 0x3098,\r
+ 0x3100, 0x3104,\r
+ 0x312d, 0x3130,\r
+ 0x318f, 0x318f,\r
+ 0x31b8, 0x31bf,\r
+ 0x31d0, 0x31ef,\r
+ 0x321f, 0x321f,\r
+ 0x3244, 0x324f,\r
+ 0x32ff, 0x32ff,\r
+ 0x4db6, 0x4dbf,\r
+ 0x9fbc, 0x9fff,\r
+ 0xa48d, 0xa48f,\r
+ 0xa4c7, 0xa6ff,\r
+ 0xa717, 0xa7ff,\r
+ 0xa82c, 0xabff,\r
+ 0xd7a4, 0xd7ff,\r
+ 0xfa2e, 0xfa2f,\r
+ 0xfa6b, 0xfa6f,\r
+ 0xfada, 0xfaff,\r
+ 0xfb07, 0xfb12,\r
+ 0xfb18, 0xfb1c,\r
+ 0xfb37, 0xfb37,\r
+ 0xfb3d, 0xfb3d,\r
+ 0xfb3f, 0xfb3f,\r
+ 0xfb42, 0xfb42,\r
+ 0xfb45, 0xfb45,\r
+ 0xfbb2, 0xfbd2,\r
+ 0xfd40, 0xfd4f,\r
+ 0xfd90, 0xfd91,\r
+ 0xfdc8, 0xfdef,\r
+ 0xfdfe, 0xfdff,\r
+ 0xfe1a, 0xfe1f,\r
+ 0xfe24, 0xfe2f,\r
+ 0xfe53, 0xfe53,\r
+ 0xfe67, 0xfe67,\r
+ 0xfe6c, 0xfe6f,\r
+ 0xfe75, 0xfe75,\r
+ 0xfefd, 0xfefe,\r
+ 0xff00, 0xff00,\r
+ 0xffbf, 0xffc1,\r
+ 0xffc8, 0xffc9,\r
+ 0xffd0, 0xffd1,\r
+ 0xffd8, 0xffd9,\r
+ 0xffdd, 0xffdf,\r
+ 0xffe7, 0xffe7,\r
+ 0xffef, 0xfff8,\r
+ 0xfffe, 0xffff,\r
+ 0x1000c, 0x1000c,\r
+ 0x10027, 0x10027,\r
+ 0x1003b, 0x1003b,\r
+ 0x1003e, 0x1003e,\r
+ 0x1004e, 0x1004f,\r
+ 0x1005e, 0x1007f,\r
+ 0x100fb, 0x100ff,\r
+ 0x10103, 0x10106,\r
+ 0x10134, 0x10136,\r
+ 0x1018b, 0x102ff,\r
+ 0x1031f, 0x1031f,\r
+ 0x10324, 0x1032f,\r
+ 0x1034b, 0x1037f,\r
+ 0x1039e, 0x1039e,\r
+ 0x103c4, 0x103c7,\r
+ 0x103d6, 0x103ff,\r
+ 0x1049e, 0x1049f,\r
+ 0x104aa, 0x107ff,\r
+ 0x10806, 0x10807,\r
+ 0x10809, 0x10809,\r
+ 0x10836, 0x10836,\r
+ 0x10839, 0x1083b,\r
+ 0x1083d, 0x1083e,\r
+ 0x10840, 0x109ff,\r
+ 0x10a04, 0x10a04,\r
+ 0x10a07, 0x10a0b,\r
+ 0x10a14, 0x10a14,\r
+ 0x10a18, 0x10a18,\r
+ 0x10a34, 0x10a37,\r
+ 0x10a3b, 0x10a3e,\r
+ 0x10a48, 0x10a4f,\r
+ 0x10a59, 0x1cfff,\r
+ 0x1d0f6, 0x1d0ff,\r
+ 0x1d127, 0x1d129,\r
+ 0x1d1de, 0x1d1ff,\r
+ 0x1d246, 0x1d2ff,\r
+ 0x1d357, 0x1d3ff,\r
+ 0x1d455, 0x1d455,\r
+ 0x1d49d, 0x1d49d,\r
+ 0x1d4a0, 0x1d4a1,\r
+ 0x1d4a3, 0x1d4a4,\r
+ 0x1d4a7, 0x1d4a8,\r
+ 0x1d4ad, 0x1d4ad,\r
+ 0x1d4ba, 0x1d4ba,\r
+ 0x1d4bc, 0x1d4bc,\r
+ 0x1d4c4, 0x1d4c4,\r
+ 0x1d506, 0x1d506,\r
+ 0x1d50b, 0x1d50c,\r
+ 0x1d515, 0x1d515,\r
+ 0x1d51d, 0x1d51d,\r
+ 0x1d53a, 0x1d53a,\r
+ 0x1d53f, 0x1d53f,\r
+ 0x1d545, 0x1d545,\r
+ 0x1d547, 0x1d549,\r
+ 0x1d551, 0x1d551,\r
+ 0x1d6a6, 0x1d6a7,\r
+ 0x1d7ca, 0x1d7cd,\r
+ 0x1d800, 0x1ffff,\r
+ 0x2a6d7, 0x2f7ff,\r
+ 0x2fa1e, 0xe0000,\r
+ 0xe0002, 0xe001f,\r
+ 0xe0080, 0xe00ff,\r
+ 0xe01f0, 0xeffff,\r
+ 0xffffe, 0xfffff,\r
+ 0x10fffe, 0x10ffff\r
+}; /* CR_Cn */\r
+\r
+/* 'Co': General Category */\r
+static const OnigCodePoint CR_Co[] = {\r
+ 3,\r
+ 0xe000, 0xf8ff,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Co */\r
+\r
+/* 'Cs': General Category */\r
+static const OnigCodePoint CR_Cs[] = {\r
+ 1,\r
+ 0xd800, 0xdfff\r
+}; /* CR_Cs */\r
+\r
+/* 'L': Major Category */\r
+static const OnigCodePoint CR_L[] = {\r
+ 347,\r
+ 0x0041, 0x005a,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b5, 0x00b5,\r
+ 0x00ba, 0x00ba,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00f6,\r
+ 0x00f8, 0x0241,\r
+ 0x0250, 0x02c1,\r
+ 0x02c6, 0x02d1,\r
+ 0x02e0, 0x02e4,\r
+ 0x02ee, 0x02ee,\r
+ 0x037a, 0x037a,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x03f5,\r
+ 0x03f7, 0x0481,\r
+ 0x048a, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x0559,\r
+ 0x0561, 0x0587,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f2,\r
+ 0x0621, 0x063a,\r
+ 0x0640, 0x064a,\r
+ 0x066e, 0x066f,\r
+ 0x0671, 0x06d3,\r
+ 0x06d5, 0x06d5,\r
+ 0x06e5, 0x06e6,\r
+ 0x06ee, 0x06ef,\r
+ 0x06fa, 0x06fc,\r
+ 0x06ff, 0x06ff,\r
+ 0x0710, 0x0710,\r
+ 0x0712, 0x072f,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07a5,\r
+ 0x07b1, 0x07b1,\r
+ 0x0904, 0x0939,\r
+ 0x093d, 0x093d,\r
+ 0x0950, 0x0950,\r
+ 0x0958, 0x0961,\r
+ 0x097d, 0x097d,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bd, 0x09bd,\r
+ 0x09ce, 0x09ce,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e1,\r
+ 0x09f0, 0x09f1,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a72, 0x0a74,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abd, 0x0abd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae1,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3d, 0x0b3d,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b71, 0x0b71,\r
+ 0x0b83, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbd, 0x0cbd,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0e01, 0x0e30,\r
+ 0x0e32, 0x0e33,\r
+ 0x0e40, 0x0e46,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb0,\r
+ 0x0eb2, 0x0eb3,\r
+ 0x0ebd, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f00,\r
+ 0x0f40, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f88, 0x0f8b,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x1050, 0x1055,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fa,\r
+ 0x10fc, 0x10fc,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x1380, 0x138f,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x166c,\r
+ 0x166f, 0x1676,\r
+ 0x1681, 0x169a,\r
+ 0x16a0, 0x16ea,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1711,\r
+ 0x1720, 0x1731,\r
+ 0x1740, 0x1751,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1780, 0x17b3,\r
+ 0x17d7, 0x17d7,\r
+ 0x17dc, 0x17dc,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a8,\r
+ 0x1900, 0x191c,\r
+ 0x1950, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19c1, 0x19c7,\r
+ 0x1a00, 0x1a16,\r
+ 0x1d00, 0x1dbf,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fbc,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fcc,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fe0, 0x1fec,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffc,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x2090, 0x2094,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210a, 0x2113,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x212f, 0x2131,\r
+ 0x2133, 0x2139,\r
+ 0x213c, 0x213f,\r
+ 0x2145, 0x2149,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c80, 0x2ce4,\r
+ 0x2d00, 0x2d25,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x3005, 0x3006,\r
+ 0x3031, 0x3035,\r
+ 0x303b, 0x303c,\r
+ 0x3041, 0x3096,\r
+ 0x309d, 0x309f,\r
+ 0x30a1, 0x30fa,\r
+ 0x30fc, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x31a0, 0x31b7,\r
+ 0x31f0, 0x31ff,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xa000, 0xa48c,\r
+ 0xa800, 0xa801,\r
+ 0xa803, 0xa805,\r
+ 0xa807, 0xa80a,\r
+ 0xa80c, 0xa822,\r
+ 0xac00, 0xd7a3,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xfb1d, 0xfb1d,\r
+ 0xfb1f, 0xfb28,\r
+ 0xfb2a, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfb,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xff21, 0xff3a,\r
+ 0xff41, 0xff5a,\r
+ 0xff66, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10300, 0x1031e,\r
+ 0x10330, 0x10349,\r
+ 0x10380, 0x1039d,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103cf,\r
+ 0x10400, 0x1049d,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a00,\r
+ 0x10a10, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6fa,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d734,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d76e,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d7a8,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d\r
+}; /* CR_L */\r
+\r
+/* 'Ll': General Category */\r
+static const OnigCodePoint CR_Ll[] = {\r
+ 480,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00b5, 0x00b5,\r
+ 0x00ba, 0x00ba,\r
+ 0x00df, 0x00f6,\r
+ 0x00f8, 0x00ff,\r
+ 0x0101, 0x0101,\r
+ 0x0103, 0x0103,\r
+ 0x0105, 0x0105,\r
+ 0x0107, 0x0107,\r
+ 0x0109, 0x0109,\r
+ 0x010b, 0x010b,\r
+ 0x010d, 0x010d,\r
+ 0x010f, 0x010f,\r
+ 0x0111, 0x0111,\r
+ 0x0113, 0x0113,\r
+ 0x0115, 0x0115,\r
+ 0x0117, 0x0117,\r
+ 0x0119, 0x0119,\r
+ 0x011b, 0x011b,\r
+ 0x011d, 0x011d,\r
+ 0x011f, 0x011f,\r
+ 0x0121, 0x0121,\r
+ 0x0123, 0x0123,\r
+ 0x0125, 0x0125,\r
+ 0x0127, 0x0127,\r
+ 0x0129, 0x0129,\r
+ 0x012b, 0x012b,\r
+ 0x012d, 0x012d,\r
+ 0x012f, 0x012f,\r
+ 0x0131, 0x0131,\r
+ 0x0133, 0x0133,\r
+ 0x0135, 0x0135,\r
+ 0x0137, 0x0138,\r
+ 0x013a, 0x013a,\r
+ 0x013c, 0x013c,\r
+ 0x013e, 0x013e,\r
+ 0x0140, 0x0140,\r
+ 0x0142, 0x0142,\r
+ 0x0144, 0x0144,\r
+ 0x0146, 0x0146,\r
+ 0x0148, 0x0149,\r
+ 0x014b, 0x014b,\r
+ 0x014d, 0x014d,\r
+ 0x014f, 0x014f,\r
+ 0x0151, 0x0151,\r
+ 0x0153, 0x0153,\r
+ 0x0155, 0x0155,\r
+ 0x0157, 0x0157,\r
+ 0x0159, 0x0159,\r
+ 0x015b, 0x015b,\r
+ 0x015d, 0x015d,\r
+ 0x015f, 0x015f,\r
+ 0x0161, 0x0161,\r
+ 0x0163, 0x0163,\r
+ 0x0165, 0x0165,\r
+ 0x0167, 0x0167,\r
+ 0x0169, 0x0169,\r
+ 0x016b, 0x016b,\r
+ 0x016d, 0x016d,\r
+ 0x016f, 0x016f,\r
+ 0x0171, 0x0171,\r
+ 0x0173, 0x0173,\r
+ 0x0175, 0x0175,\r
+ 0x0177, 0x0177,\r
+ 0x017a, 0x017a,\r
+ 0x017c, 0x017c,\r
+ 0x017e, 0x0180,\r
+ 0x0183, 0x0183,\r
+ 0x0185, 0x0185,\r
+ 0x0188, 0x0188,\r
+ 0x018c, 0x018d,\r
+ 0x0192, 0x0192,\r
+ 0x0195, 0x0195,\r
+ 0x0199, 0x019b,\r
+ 0x019e, 0x019e,\r
+ 0x01a1, 0x01a1,\r
+ 0x01a3, 0x01a3,\r
+ 0x01a5, 0x01a5,\r
+ 0x01a8, 0x01a8,\r
+ 0x01aa, 0x01ab,\r
+ 0x01ad, 0x01ad,\r
+ 0x01b0, 0x01b0,\r
+ 0x01b4, 0x01b4,\r
+ 0x01b6, 0x01b6,\r
+ 0x01b9, 0x01ba,\r
+ 0x01bd, 0x01bf,\r
+ 0x01c6, 0x01c6,\r
+ 0x01c9, 0x01c9,\r
+ 0x01cc, 0x01cc,\r
+ 0x01ce, 0x01ce,\r
+ 0x01d0, 0x01d0,\r
+ 0x01d2, 0x01d2,\r
+ 0x01d4, 0x01d4,\r
+ 0x01d6, 0x01d6,\r
+ 0x01d8, 0x01d8,\r
+ 0x01da, 0x01da,\r
+ 0x01dc, 0x01dd,\r
+ 0x01df, 0x01df,\r
+ 0x01e1, 0x01e1,\r
+ 0x01e3, 0x01e3,\r
+ 0x01e5, 0x01e5,\r
+ 0x01e7, 0x01e7,\r
+ 0x01e9, 0x01e9,\r
+ 0x01eb, 0x01eb,\r
+ 0x01ed, 0x01ed,\r
+ 0x01ef, 0x01f0,\r
+ 0x01f3, 0x01f3,\r
+ 0x01f5, 0x01f5,\r
+ 0x01f9, 0x01f9,\r
+ 0x01fb, 0x01fb,\r
+ 0x01fd, 0x01fd,\r
+ 0x01ff, 0x01ff,\r
+ 0x0201, 0x0201,\r
+ 0x0203, 0x0203,\r
+ 0x0205, 0x0205,\r
+ 0x0207, 0x0207,\r
+ 0x0209, 0x0209,\r
+ 0x020b, 0x020b,\r
+ 0x020d, 0x020d,\r
+ 0x020f, 0x020f,\r
+ 0x0211, 0x0211,\r
+ 0x0213, 0x0213,\r
+ 0x0215, 0x0215,\r
+ 0x0217, 0x0217,\r
+ 0x0219, 0x0219,\r
+ 0x021b, 0x021b,\r
+ 0x021d, 0x021d,\r
+ 0x021f, 0x021f,\r
+ 0x0221, 0x0221,\r
+ 0x0223, 0x0223,\r
+ 0x0225, 0x0225,\r
+ 0x0227, 0x0227,\r
+ 0x0229, 0x0229,\r
+ 0x022b, 0x022b,\r
+ 0x022d, 0x022d,\r
+ 0x022f, 0x022f,\r
+ 0x0231, 0x0231,\r
+ 0x0233, 0x0239,\r
+ 0x023c, 0x023c,\r
+ 0x023f, 0x0240,\r
+ 0x0250, 0x02af,\r
+ 0x0390, 0x0390,\r
+ 0x03ac, 0x03ce,\r
+ 0x03d0, 0x03d1,\r
+ 0x03d5, 0x03d7,\r
+ 0x03d9, 0x03d9,\r
+ 0x03db, 0x03db,\r
+ 0x03dd, 0x03dd,\r
+ 0x03df, 0x03df,\r
+ 0x03e1, 0x03e1,\r
+ 0x03e3, 0x03e3,\r
+ 0x03e5, 0x03e5,\r
+ 0x03e7, 0x03e7,\r
+ 0x03e9, 0x03e9,\r
+ 0x03eb, 0x03eb,\r
+ 0x03ed, 0x03ed,\r
+ 0x03ef, 0x03f3,\r
+ 0x03f5, 0x03f5,\r
+ 0x03f8, 0x03f8,\r
+ 0x03fb, 0x03fc,\r
+ 0x0430, 0x045f,\r
+ 0x0461, 0x0461,\r
+ 0x0463, 0x0463,\r
+ 0x0465, 0x0465,\r
+ 0x0467, 0x0467,\r
+ 0x0469, 0x0469,\r
+ 0x046b, 0x046b,\r
+ 0x046d, 0x046d,\r
+ 0x046f, 0x046f,\r
+ 0x0471, 0x0471,\r
+ 0x0473, 0x0473,\r
+ 0x0475, 0x0475,\r
+ 0x0477, 0x0477,\r
+ 0x0479, 0x0479,\r
+ 0x047b, 0x047b,\r
+ 0x047d, 0x047d,\r
+ 0x047f, 0x047f,\r
+ 0x0481, 0x0481,\r
+ 0x048b, 0x048b,\r
+ 0x048d, 0x048d,\r
+ 0x048f, 0x048f,\r
+ 0x0491, 0x0491,\r
+ 0x0493, 0x0493,\r
+ 0x0495, 0x0495,\r
+ 0x0497, 0x0497,\r
+ 0x0499, 0x0499,\r
+ 0x049b, 0x049b,\r
+ 0x049d, 0x049d,\r
+ 0x049f, 0x049f,\r
+ 0x04a1, 0x04a1,\r
+ 0x04a3, 0x04a3,\r
+ 0x04a5, 0x04a5,\r
+ 0x04a7, 0x04a7,\r
+ 0x04a9, 0x04a9,\r
+ 0x04ab, 0x04ab,\r
+ 0x04ad, 0x04ad,\r
+ 0x04af, 0x04af,\r
+ 0x04b1, 0x04b1,\r
+ 0x04b3, 0x04b3,\r
+ 0x04b5, 0x04b5,\r
+ 0x04b7, 0x04b7,\r
+ 0x04b9, 0x04b9,\r
+ 0x04bb, 0x04bb,\r
+ 0x04bd, 0x04bd,\r
+ 0x04bf, 0x04bf,\r
+ 0x04c2, 0x04c2,\r
+ 0x04c4, 0x04c4,\r
+ 0x04c6, 0x04c6,\r
+ 0x04c8, 0x04c8,\r
+ 0x04ca, 0x04ca,\r
+ 0x04cc, 0x04cc,\r
+ 0x04ce, 0x04ce,\r
+ 0x04d1, 0x04d1,\r
+ 0x04d3, 0x04d3,\r
+ 0x04d5, 0x04d5,\r
+ 0x04d7, 0x04d7,\r
+ 0x04d9, 0x04d9,\r
+ 0x04db, 0x04db,\r
+ 0x04dd, 0x04dd,\r
+ 0x04df, 0x04df,\r
+ 0x04e1, 0x04e1,\r
+ 0x04e3, 0x04e3,\r
+ 0x04e5, 0x04e5,\r
+ 0x04e7, 0x04e7,\r
+ 0x04e9, 0x04e9,\r
+ 0x04eb, 0x04eb,\r
+ 0x04ed, 0x04ed,\r
+ 0x04ef, 0x04ef,\r
+ 0x04f1, 0x04f1,\r
+ 0x04f3, 0x04f3,\r
+ 0x04f5, 0x04f5,\r
+ 0x04f7, 0x04f7,\r
+ 0x04f9, 0x04f9,\r
+ 0x0501, 0x0501,\r
+ 0x0503, 0x0503,\r
+ 0x0505, 0x0505,\r
+ 0x0507, 0x0507,\r
+ 0x0509, 0x0509,\r
+ 0x050b, 0x050b,\r
+ 0x050d, 0x050d,\r
+ 0x050f, 0x050f,\r
+ 0x0561, 0x0587,\r
+ 0x1d00, 0x1d2b,\r
+ 0x1d62, 0x1d77,\r
+ 0x1d79, 0x1d9a,\r
+ 0x1e01, 0x1e01,\r
+ 0x1e03, 0x1e03,\r
+ 0x1e05, 0x1e05,\r
+ 0x1e07, 0x1e07,\r
+ 0x1e09, 0x1e09,\r
+ 0x1e0b, 0x1e0b,\r
+ 0x1e0d, 0x1e0d,\r
+ 0x1e0f, 0x1e0f,\r
+ 0x1e11, 0x1e11,\r
+ 0x1e13, 0x1e13,\r
+ 0x1e15, 0x1e15,\r
+ 0x1e17, 0x1e17,\r
+ 0x1e19, 0x1e19,\r
+ 0x1e1b, 0x1e1b,\r
+ 0x1e1d, 0x1e1d,\r
+ 0x1e1f, 0x1e1f,\r
+ 0x1e21, 0x1e21,\r
+ 0x1e23, 0x1e23,\r
+ 0x1e25, 0x1e25,\r
+ 0x1e27, 0x1e27,\r
+ 0x1e29, 0x1e29,\r
+ 0x1e2b, 0x1e2b,\r
+ 0x1e2d, 0x1e2d,\r
+ 0x1e2f, 0x1e2f,\r
+ 0x1e31, 0x1e31,\r
+ 0x1e33, 0x1e33,\r
+ 0x1e35, 0x1e35,\r
+ 0x1e37, 0x1e37,\r
+ 0x1e39, 0x1e39,\r
+ 0x1e3b, 0x1e3b,\r
+ 0x1e3d, 0x1e3d,\r
+ 0x1e3f, 0x1e3f,\r
+ 0x1e41, 0x1e41,\r
+ 0x1e43, 0x1e43,\r
+ 0x1e45, 0x1e45,\r
+ 0x1e47, 0x1e47,\r
+ 0x1e49, 0x1e49,\r
+ 0x1e4b, 0x1e4b,\r
+ 0x1e4d, 0x1e4d,\r
+ 0x1e4f, 0x1e4f,\r
+ 0x1e51, 0x1e51,\r
+ 0x1e53, 0x1e53,\r
+ 0x1e55, 0x1e55,\r
+ 0x1e57, 0x1e57,\r
+ 0x1e59, 0x1e59,\r
+ 0x1e5b, 0x1e5b,\r
+ 0x1e5d, 0x1e5d,\r
+ 0x1e5f, 0x1e5f,\r
+ 0x1e61, 0x1e61,\r
+ 0x1e63, 0x1e63,\r
+ 0x1e65, 0x1e65,\r
+ 0x1e67, 0x1e67,\r
+ 0x1e69, 0x1e69,\r
+ 0x1e6b, 0x1e6b,\r
+ 0x1e6d, 0x1e6d,\r
+ 0x1e6f, 0x1e6f,\r
+ 0x1e71, 0x1e71,\r
+ 0x1e73, 0x1e73,\r
+ 0x1e75, 0x1e75,\r
+ 0x1e77, 0x1e77,\r
+ 0x1e79, 0x1e79,\r
+ 0x1e7b, 0x1e7b,\r
+ 0x1e7d, 0x1e7d,\r
+ 0x1e7f, 0x1e7f,\r
+ 0x1e81, 0x1e81,\r
+ 0x1e83, 0x1e83,\r
+ 0x1e85, 0x1e85,\r
+ 0x1e87, 0x1e87,\r
+ 0x1e89, 0x1e89,\r
+ 0x1e8b, 0x1e8b,\r
+ 0x1e8d, 0x1e8d,\r
+ 0x1e8f, 0x1e8f,\r
+ 0x1e91, 0x1e91,\r
+ 0x1e93, 0x1e93,\r
+ 0x1e95, 0x1e9b,\r
+ 0x1ea1, 0x1ea1,\r
+ 0x1ea3, 0x1ea3,\r
+ 0x1ea5, 0x1ea5,\r
+ 0x1ea7, 0x1ea7,\r
+ 0x1ea9, 0x1ea9,\r
+ 0x1eab, 0x1eab,\r
+ 0x1ead, 0x1ead,\r
+ 0x1eaf, 0x1eaf,\r
+ 0x1eb1, 0x1eb1,\r
+ 0x1eb3, 0x1eb3,\r
+ 0x1eb5, 0x1eb5,\r
+ 0x1eb7, 0x1eb7,\r
+ 0x1eb9, 0x1eb9,\r
+ 0x1ebb, 0x1ebb,\r
+ 0x1ebd, 0x1ebd,\r
+ 0x1ebf, 0x1ebf,\r
+ 0x1ec1, 0x1ec1,\r
+ 0x1ec3, 0x1ec3,\r
+ 0x1ec5, 0x1ec5,\r
+ 0x1ec7, 0x1ec7,\r
+ 0x1ec9, 0x1ec9,\r
+ 0x1ecb, 0x1ecb,\r
+ 0x1ecd, 0x1ecd,\r
+ 0x1ecf, 0x1ecf,\r
+ 0x1ed1, 0x1ed1,\r
+ 0x1ed3, 0x1ed3,\r
+ 0x1ed5, 0x1ed5,\r
+ 0x1ed7, 0x1ed7,\r
+ 0x1ed9, 0x1ed9,\r
+ 0x1edb, 0x1edb,\r
+ 0x1edd, 0x1edd,\r
+ 0x1edf, 0x1edf,\r
+ 0x1ee1, 0x1ee1,\r
+ 0x1ee3, 0x1ee3,\r
+ 0x1ee5, 0x1ee5,\r
+ 0x1ee7, 0x1ee7,\r
+ 0x1ee9, 0x1ee9,\r
+ 0x1eeb, 0x1eeb,\r
+ 0x1eed, 0x1eed,\r
+ 0x1eef, 0x1eef,\r
+ 0x1ef1, 0x1ef1,\r
+ 0x1ef3, 0x1ef3,\r
+ 0x1ef5, 0x1ef5,\r
+ 0x1ef7, 0x1ef7,\r
+ 0x1ef9, 0x1ef9,\r
+ 0x1f00, 0x1f07,\r
+ 0x1f10, 0x1f15,\r
+ 0x1f20, 0x1f27,\r
+ 0x1f30, 0x1f37,\r
+ 0x1f40, 0x1f45,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f60, 0x1f67,\r
+ 0x1f70, 0x1f7d,\r
+ 0x1f80, 0x1f87,\r
+ 0x1f90, 0x1f97,\r
+ 0x1fa0, 0x1fa7,\r
+ 0x1fb0, 0x1fb4,\r
+ 0x1fb6, 0x1fb7,\r
+ 0x1fbe, 0x1fbe,\r
+ 0x1fc2, 0x1fc4,\r
+ 0x1fc6, 0x1fc7,\r
+ 0x1fd0, 0x1fd3,\r
+ 0x1fd6, 0x1fd7,\r
+ 0x1fe0, 0x1fe7,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ff7,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x210a, 0x210a,\r
+ 0x210e, 0x210f,\r
+ 0x2113, 0x2113,\r
+ 0x212f, 0x212f,\r
+ 0x2134, 0x2134,\r
+ 0x2139, 0x2139,\r
+ 0x213c, 0x213d,\r
+ 0x2146, 0x2149,\r
+ 0x2c30, 0x2c5e,\r
+ 0x2c81, 0x2c81,\r
+ 0x2c83, 0x2c83,\r
+ 0x2c85, 0x2c85,\r
+ 0x2c87, 0x2c87,\r
+ 0x2c89, 0x2c89,\r
+ 0x2c8b, 0x2c8b,\r
+ 0x2c8d, 0x2c8d,\r
+ 0x2c8f, 0x2c8f,\r
+ 0x2c91, 0x2c91,\r
+ 0x2c93, 0x2c93,\r
+ 0x2c95, 0x2c95,\r
+ 0x2c97, 0x2c97,\r
+ 0x2c99, 0x2c99,\r
+ 0x2c9b, 0x2c9b,\r
+ 0x2c9d, 0x2c9d,\r
+ 0x2c9f, 0x2c9f,\r
+ 0x2ca1, 0x2ca1,\r
+ 0x2ca3, 0x2ca3,\r
+ 0x2ca5, 0x2ca5,\r
+ 0x2ca7, 0x2ca7,\r
+ 0x2ca9, 0x2ca9,\r
+ 0x2cab, 0x2cab,\r
+ 0x2cad, 0x2cad,\r
+ 0x2caf, 0x2caf,\r
+ 0x2cb1, 0x2cb1,\r
+ 0x2cb3, 0x2cb3,\r
+ 0x2cb5, 0x2cb5,\r
+ 0x2cb7, 0x2cb7,\r
+ 0x2cb9, 0x2cb9,\r
+ 0x2cbb, 0x2cbb,\r
+ 0x2cbd, 0x2cbd,\r
+ 0x2cbf, 0x2cbf,\r
+ 0x2cc1, 0x2cc1,\r
+ 0x2cc3, 0x2cc3,\r
+ 0x2cc5, 0x2cc5,\r
+ 0x2cc7, 0x2cc7,\r
+ 0x2cc9, 0x2cc9,\r
+ 0x2ccb, 0x2ccb,\r
+ 0x2ccd, 0x2ccd,\r
+ 0x2ccf, 0x2ccf,\r
+ 0x2cd1, 0x2cd1,\r
+ 0x2cd3, 0x2cd3,\r
+ 0x2cd5, 0x2cd5,\r
+ 0x2cd7, 0x2cd7,\r
+ 0x2cd9, 0x2cd9,\r
+ 0x2cdb, 0x2cdb,\r
+ 0x2cdd, 0x2cdd,\r
+ 0x2cdf, 0x2cdf,\r
+ 0x2ce1, 0x2ce1,\r
+ 0x2ce3, 0x2ce4,\r
+ 0x2d00, 0x2d25,\r
+ 0xfb00, 0xfb06,\r
+ 0xfb13, 0xfb17,\r
+ 0xff41, 0xff5a,\r
+ 0x10428, 0x1044f,\r
+ 0x1d41a, 0x1d433,\r
+ 0x1d44e, 0x1d454,\r
+ 0x1d456, 0x1d467,\r
+ 0x1d482, 0x1d49b,\r
+ 0x1d4b6, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d4cf,\r
+ 0x1d4ea, 0x1d503,\r
+ 0x1d51e, 0x1d537,\r
+ 0x1d552, 0x1d56b,\r
+ 0x1d586, 0x1d59f,\r
+ 0x1d5ba, 0x1d5d3,\r
+ 0x1d5ee, 0x1d607,\r
+ 0x1d622, 0x1d63b,\r
+ 0x1d656, 0x1d66f,\r
+ 0x1d68a, 0x1d6a5,\r
+ 0x1d6c2, 0x1d6da,\r
+ 0x1d6dc, 0x1d6e1,\r
+ 0x1d6fc, 0x1d714,\r
+ 0x1d716, 0x1d71b,\r
+ 0x1d736, 0x1d74e,\r
+ 0x1d750, 0x1d755,\r
+ 0x1d770, 0x1d788,\r
+ 0x1d78a, 0x1d78f,\r
+ 0x1d7aa, 0x1d7c2,\r
+ 0x1d7c4, 0x1d7c9\r
+}; /* CR_Ll */\r
+\r
+/* 'Lm': General Category */\r
+static const OnigCodePoint CR_Lm[] = {\r
+ 26,\r
+ 0x02b0, 0x02c1,\r
+ 0x02c6, 0x02d1,\r
+ 0x02e0, 0x02e4,\r
+ 0x02ee, 0x02ee,\r
+ 0x037a, 0x037a,\r
+ 0x0559, 0x0559,\r
+ 0x0640, 0x0640,\r
+ 0x06e5, 0x06e6,\r
+ 0x0e46, 0x0e46,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x10fc, 0x10fc,\r
+ 0x17d7, 0x17d7,\r
+ 0x1843, 0x1843,\r
+ 0x1d2c, 0x1d61,\r
+ 0x1d78, 0x1d78,\r
+ 0x1d9b, 0x1dbf,\r
+ 0x2090, 0x2094,\r
+ 0x2d6f, 0x2d6f,\r
+ 0x3005, 0x3005,\r
+ 0x3031, 0x3035,\r
+ 0x303b, 0x303b,\r
+ 0x309d, 0x309e,\r
+ 0x30fc, 0x30fe,\r
+ 0xa015, 0xa015,\r
+ 0xff70, 0xff70,\r
+ 0xff9e, 0xff9f\r
+}; /* CR_Lm */\r
+\r
+/* 'Lo': General Category */\r
+static const OnigCodePoint CR_Lo[] = {\r
+ 245,\r
+ 0x01bb, 0x01bb,\r
+ 0x01c0, 0x01c3,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f2,\r
+ 0x0621, 0x063a,\r
+ 0x0641, 0x064a,\r
+ 0x066e, 0x066f,\r
+ 0x0671, 0x06d3,\r
+ 0x06d5, 0x06d5,\r
+ 0x06ee, 0x06ef,\r
+ 0x06fa, 0x06fc,\r
+ 0x06ff, 0x06ff,\r
+ 0x0710, 0x0710,\r
+ 0x0712, 0x072f,\r
+ 0x074d, 0x076d,\r
+ 0x0780, 0x07a5,\r
+ 0x07b1, 0x07b1,\r
+ 0x0904, 0x0939,\r
+ 0x093d, 0x093d,\r
+ 0x0950, 0x0950,\r
+ 0x0958, 0x0961,\r
+ 0x097d, 0x097d,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bd, 0x09bd,\r
+ 0x09ce, 0x09ce,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e1,\r
+ 0x09f0, 0x09f1,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a72, 0x0a74,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abd, 0x0abd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae1,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3d, 0x0b3d,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b71, 0x0b71,\r
+ 0x0b83, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbd, 0x0cbd,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0e01, 0x0e30,\r
+ 0x0e32, 0x0e33,\r
+ 0x0e40, 0x0e45,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb0,\r
+ 0x0eb2, 0x0eb3,\r
+ 0x0ebd, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0edc, 0x0edd,\r
+ 0x0f00, 0x0f00,\r
+ 0x0f40, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f88, 0x0f8b,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x1050, 0x1055,\r
+ 0x10d0, 0x10fa,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x1380, 0x138f,\r
+ 0x13a0, 0x13f4,\r
+ 0x1401, 0x166c,\r
+ 0x166f, 0x1676,\r
+ 0x1681, 0x169a,\r
+ 0x16a0, 0x16ea,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1711,\r
+ 0x1720, 0x1731,\r
+ 0x1740, 0x1751,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1780, 0x17b3,\r
+ 0x17dc, 0x17dc,\r
+ 0x1820, 0x1842,\r
+ 0x1844, 0x1877,\r
+ 0x1880, 0x18a8,\r
+ 0x1900, 0x191c,\r
+ 0x1950, 0x196d,\r
+ 0x1970, 0x1974,\r
+ 0x1980, 0x19a9,\r
+ 0x19c1, 0x19c7,\r
+ 0x1a00, 0x1a16,\r
+ 0x2135, 0x2138,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde,\r
+ 0x3006, 0x3006,\r
+ 0x303c, 0x303c,\r
+ 0x3041, 0x3096,\r
+ 0x309f, 0x309f,\r
+ 0x30a1, 0x30fa,\r
+ 0x30ff, 0x30ff,\r
+ 0x3105, 0x312c,\r
+ 0x3131, 0x318e,\r
+ 0x31a0, 0x31b7,\r
+ 0x31f0, 0x31ff,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xa000, 0xa014,\r
+ 0xa016, 0xa48c,\r
+ 0xa800, 0xa801,\r
+ 0xa803, 0xa805,\r
+ 0xa807, 0xa80a,\r
+ 0xa80c, 0xa822,\r
+ 0xac00, 0xd7a3,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0xfb1d, 0xfb1d,\r
+ 0xfb1f, 0xfb28,\r
+ 0xfb2a, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfb,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc,\r
+ 0xff66, 0xff6f,\r
+ 0xff71, 0xff9d,\r
+ 0xffa0, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa,\r
+ 0x10300, 0x1031e,\r
+ 0x10330, 0x10349,\r
+ 0x10380, 0x1039d,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103cf,\r
+ 0x10450, 0x1049d,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f,\r
+ 0x10a00, 0x10a00,\r
+ 0x10a10, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d\r
+}; /* CR_Lo */\r
+\r
+/* 'Lt': General Category */\r
+static const OnigCodePoint CR_Lt[] = {\r
+ 10,\r
+ 0x01c5, 0x01c5,\r
+ 0x01c8, 0x01c8,\r
+ 0x01cb, 0x01cb,\r
+ 0x01f2, 0x01f2,\r
+ 0x1f88, 0x1f8f,\r
+ 0x1f98, 0x1f9f,\r
+ 0x1fa8, 0x1faf,\r
+ 0x1fbc, 0x1fbc,\r
+ 0x1fcc, 0x1fcc,\r
+ 0x1ffc, 0x1ffc\r
+}; /* CR_Lt */\r
+\r
+/* 'Lu': General Category */\r
+static const OnigCodePoint CR_Lu[] = {\r
+ 476,\r
+ 0x0041, 0x005a,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00de,\r
+ 0x0100, 0x0100,\r
+ 0x0102, 0x0102,\r
+ 0x0104, 0x0104,\r
+ 0x0106, 0x0106,\r
+ 0x0108, 0x0108,\r
+ 0x010a, 0x010a,\r
+ 0x010c, 0x010c,\r
+ 0x010e, 0x010e,\r
+ 0x0110, 0x0110,\r
+ 0x0112, 0x0112,\r
+ 0x0114, 0x0114,\r
+ 0x0116, 0x0116,\r
+ 0x0118, 0x0118,\r
+ 0x011a, 0x011a,\r
+ 0x011c, 0x011c,\r
+ 0x011e, 0x011e,\r
+ 0x0120, 0x0120,\r
+ 0x0122, 0x0122,\r
+ 0x0124, 0x0124,\r
+ 0x0126, 0x0126,\r
+ 0x0128, 0x0128,\r
+ 0x012a, 0x012a,\r
+ 0x012c, 0x012c,\r
+ 0x012e, 0x012e,\r
+ 0x0130, 0x0130,\r
+ 0x0132, 0x0132,\r
+ 0x0134, 0x0134,\r
+ 0x0136, 0x0136,\r
+ 0x0139, 0x0139,\r
+ 0x013b, 0x013b,\r
+ 0x013d, 0x013d,\r
+ 0x013f, 0x013f,\r
+ 0x0141, 0x0141,\r
+ 0x0143, 0x0143,\r
+ 0x0145, 0x0145,\r
+ 0x0147, 0x0147,\r
+ 0x014a, 0x014a,\r
+ 0x014c, 0x014c,\r
+ 0x014e, 0x014e,\r
+ 0x0150, 0x0150,\r
+ 0x0152, 0x0152,\r
+ 0x0154, 0x0154,\r
+ 0x0156, 0x0156,\r
+ 0x0158, 0x0158,\r
+ 0x015a, 0x015a,\r
+ 0x015c, 0x015c,\r
+ 0x015e, 0x015e,\r
+ 0x0160, 0x0160,\r
+ 0x0162, 0x0162,\r
+ 0x0164, 0x0164,\r
+ 0x0166, 0x0166,\r
+ 0x0168, 0x0168,\r
+ 0x016a, 0x016a,\r
+ 0x016c, 0x016c,\r
+ 0x016e, 0x016e,\r
+ 0x0170, 0x0170,\r
+ 0x0172, 0x0172,\r
+ 0x0174, 0x0174,\r
+ 0x0176, 0x0176,\r
+ 0x0178, 0x0179,\r
+ 0x017b, 0x017b,\r
+ 0x017d, 0x017d,\r
+ 0x0181, 0x0182,\r
+ 0x0184, 0x0184,\r
+ 0x0186, 0x0187,\r
+ 0x0189, 0x018b,\r
+ 0x018e, 0x0191,\r
+ 0x0193, 0x0194,\r
+ 0x0196, 0x0198,\r
+ 0x019c, 0x019d,\r
+ 0x019f, 0x01a0,\r
+ 0x01a2, 0x01a2,\r
+ 0x01a4, 0x01a4,\r
+ 0x01a6, 0x01a7,\r
+ 0x01a9, 0x01a9,\r
+ 0x01ac, 0x01ac,\r
+ 0x01ae, 0x01af,\r
+ 0x01b1, 0x01b3,\r
+ 0x01b5, 0x01b5,\r
+ 0x01b7, 0x01b8,\r
+ 0x01bc, 0x01bc,\r
+ 0x01c4, 0x01c4,\r
+ 0x01c7, 0x01c7,\r
+ 0x01ca, 0x01ca,\r
+ 0x01cd, 0x01cd,\r
+ 0x01cf, 0x01cf,\r
+ 0x01d1, 0x01d1,\r
+ 0x01d3, 0x01d3,\r
+ 0x01d5, 0x01d5,\r
+ 0x01d7, 0x01d7,\r
+ 0x01d9, 0x01d9,\r
+ 0x01db, 0x01db,\r
+ 0x01de, 0x01de,\r
+ 0x01e0, 0x01e0,\r
+ 0x01e2, 0x01e2,\r
+ 0x01e4, 0x01e4,\r
+ 0x01e6, 0x01e6,\r
+ 0x01e8, 0x01e8,\r
+ 0x01ea, 0x01ea,\r
+ 0x01ec, 0x01ec,\r
+ 0x01ee, 0x01ee,\r
+ 0x01f1, 0x01f1,\r
+ 0x01f4, 0x01f4,\r
+ 0x01f6, 0x01f8,\r
+ 0x01fa, 0x01fa,\r
+ 0x01fc, 0x01fc,\r
+ 0x01fe, 0x01fe,\r
+ 0x0200, 0x0200,\r
+ 0x0202, 0x0202,\r
+ 0x0204, 0x0204,\r
+ 0x0206, 0x0206,\r
+ 0x0208, 0x0208,\r
+ 0x020a, 0x020a,\r
+ 0x020c, 0x020c,\r
+ 0x020e, 0x020e,\r
+ 0x0210, 0x0210,\r
+ 0x0212, 0x0212,\r
+ 0x0214, 0x0214,\r
+ 0x0216, 0x0216,\r
+ 0x0218, 0x0218,\r
+ 0x021a, 0x021a,\r
+ 0x021c, 0x021c,\r
+ 0x021e, 0x021e,\r
+ 0x0220, 0x0220,\r
+ 0x0222, 0x0222,\r
+ 0x0224, 0x0224,\r
+ 0x0226, 0x0226,\r
+ 0x0228, 0x0228,\r
+ 0x022a, 0x022a,\r
+ 0x022c, 0x022c,\r
+ 0x022e, 0x022e,\r
+ 0x0230, 0x0230,\r
+ 0x0232, 0x0232,\r
+ 0x023a, 0x023b,\r
+ 0x023d, 0x023e,\r
+ 0x0241, 0x0241,\r
+ 0x0386, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x038f,\r
+ 0x0391, 0x03a1,\r
+ 0x03a3, 0x03ab,\r
+ 0x03d2, 0x03d4,\r
+ 0x03d8, 0x03d8,\r
+ 0x03da, 0x03da,\r
+ 0x03dc, 0x03dc,\r
+ 0x03de, 0x03de,\r
+ 0x03e0, 0x03e0,\r
+ 0x03e2, 0x03e2,\r
+ 0x03e4, 0x03e4,\r
+ 0x03e6, 0x03e6,\r
+ 0x03e8, 0x03e8,\r
+ 0x03ea, 0x03ea,\r
+ 0x03ec, 0x03ec,\r
+ 0x03ee, 0x03ee,\r
+ 0x03f4, 0x03f4,\r
+ 0x03f7, 0x03f7,\r
+ 0x03f9, 0x03fa,\r
+ 0x03fd, 0x042f,\r
+ 0x0460, 0x0460,\r
+ 0x0462, 0x0462,\r
+ 0x0464, 0x0464,\r
+ 0x0466, 0x0466,\r
+ 0x0468, 0x0468,\r
+ 0x046a, 0x046a,\r
+ 0x046c, 0x046c,\r
+ 0x046e, 0x046e,\r
+ 0x0470, 0x0470,\r
+ 0x0472, 0x0472,\r
+ 0x0474, 0x0474,\r
+ 0x0476, 0x0476,\r
+ 0x0478, 0x0478,\r
+ 0x047a, 0x047a,\r
+ 0x047c, 0x047c,\r
+ 0x047e, 0x047e,\r
+ 0x0480, 0x0480,\r
+ 0x048a, 0x048a,\r
+ 0x048c, 0x048c,\r
+ 0x048e, 0x048e,\r
+ 0x0490, 0x0490,\r
+ 0x0492, 0x0492,\r
+ 0x0494, 0x0494,\r
+ 0x0496, 0x0496,\r
+ 0x0498, 0x0498,\r
+ 0x049a, 0x049a,\r
+ 0x049c, 0x049c,\r
+ 0x049e, 0x049e,\r
+ 0x04a0, 0x04a0,\r
+ 0x04a2, 0x04a2,\r
+ 0x04a4, 0x04a4,\r
+ 0x04a6, 0x04a6,\r
+ 0x04a8, 0x04a8,\r
+ 0x04aa, 0x04aa,\r
+ 0x04ac, 0x04ac,\r
+ 0x04ae, 0x04ae,\r
+ 0x04b0, 0x04b0,\r
+ 0x04b2, 0x04b2,\r
+ 0x04b4, 0x04b4,\r
+ 0x04b6, 0x04b6,\r
+ 0x04b8, 0x04b8,\r
+ 0x04ba, 0x04ba,\r
+ 0x04bc, 0x04bc,\r
+ 0x04be, 0x04be,\r
+ 0x04c0, 0x04c1,\r
+ 0x04c3, 0x04c3,\r
+ 0x04c5, 0x04c5,\r
+ 0x04c7, 0x04c7,\r
+ 0x04c9, 0x04c9,\r
+ 0x04cb, 0x04cb,\r
+ 0x04cd, 0x04cd,\r
+ 0x04d0, 0x04d0,\r
+ 0x04d2, 0x04d2,\r
+ 0x04d4, 0x04d4,\r
+ 0x04d6, 0x04d6,\r
+ 0x04d8, 0x04d8,\r
+ 0x04da, 0x04da,\r
+ 0x04dc, 0x04dc,\r
+ 0x04de, 0x04de,\r
+ 0x04e0, 0x04e0,\r
+ 0x04e2, 0x04e2,\r
+ 0x04e4, 0x04e4,\r
+ 0x04e6, 0x04e6,\r
+ 0x04e8, 0x04e8,\r
+ 0x04ea, 0x04ea,\r
+ 0x04ec, 0x04ec,\r
+ 0x04ee, 0x04ee,\r
+ 0x04f0, 0x04f0,\r
+ 0x04f2, 0x04f2,\r
+ 0x04f4, 0x04f4,\r
+ 0x04f6, 0x04f6,\r
+ 0x04f8, 0x04f8,\r
+ 0x0500, 0x0500,\r
+ 0x0502, 0x0502,\r
+ 0x0504, 0x0504,\r
+ 0x0506, 0x0506,\r
+ 0x0508, 0x0508,\r
+ 0x050a, 0x050a,\r
+ 0x050c, 0x050c,\r
+ 0x050e, 0x050e,\r
+ 0x0531, 0x0556,\r
+ 0x10a0, 0x10c5,\r
+ 0x1e00, 0x1e00,\r
+ 0x1e02, 0x1e02,\r
+ 0x1e04, 0x1e04,\r
+ 0x1e06, 0x1e06,\r
+ 0x1e08, 0x1e08,\r
+ 0x1e0a, 0x1e0a,\r
+ 0x1e0c, 0x1e0c,\r
+ 0x1e0e, 0x1e0e,\r
+ 0x1e10, 0x1e10,\r
+ 0x1e12, 0x1e12,\r
+ 0x1e14, 0x1e14,\r
+ 0x1e16, 0x1e16,\r
+ 0x1e18, 0x1e18,\r
+ 0x1e1a, 0x1e1a,\r
+ 0x1e1c, 0x1e1c,\r
+ 0x1e1e, 0x1e1e,\r
+ 0x1e20, 0x1e20,\r
+ 0x1e22, 0x1e22,\r
+ 0x1e24, 0x1e24,\r
+ 0x1e26, 0x1e26,\r
+ 0x1e28, 0x1e28,\r
+ 0x1e2a, 0x1e2a,\r
+ 0x1e2c, 0x1e2c,\r
+ 0x1e2e, 0x1e2e,\r
+ 0x1e30, 0x1e30,\r
+ 0x1e32, 0x1e32,\r
+ 0x1e34, 0x1e34,\r
+ 0x1e36, 0x1e36,\r
+ 0x1e38, 0x1e38,\r
+ 0x1e3a, 0x1e3a,\r
+ 0x1e3c, 0x1e3c,\r
+ 0x1e3e, 0x1e3e,\r
+ 0x1e40, 0x1e40,\r
+ 0x1e42, 0x1e42,\r
+ 0x1e44, 0x1e44,\r
+ 0x1e46, 0x1e46,\r
+ 0x1e48, 0x1e48,\r
+ 0x1e4a, 0x1e4a,\r
+ 0x1e4c, 0x1e4c,\r
+ 0x1e4e, 0x1e4e,\r
+ 0x1e50, 0x1e50,\r
+ 0x1e52, 0x1e52,\r
+ 0x1e54, 0x1e54,\r
+ 0x1e56, 0x1e56,\r
+ 0x1e58, 0x1e58,\r
+ 0x1e5a, 0x1e5a,\r
+ 0x1e5c, 0x1e5c,\r
+ 0x1e5e, 0x1e5e,\r
+ 0x1e60, 0x1e60,\r
+ 0x1e62, 0x1e62,\r
+ 0x1e64, 0x1e64,\r
+ 0x1e66, 0x1e66,\r
+ 0x1e68, 0x1e68,\r
+ 0x1e6a, 0x1e6a,\r
+ 0x1e6c, 0x1e6c,\r
+ 0x1e6e, 0x1e6e,\r
+ 0x1e70, 0x1e70,\r
+ 0x1e72, 0x1e72,\r
+ 0x1e74, 0x1e74,\r
+ 0x1e76, 0x1e76,\r
+ 0x1e78, 0x1e78,\r
+ 0x1e7a, 0x1e7a,\r
+ 0x1e7c, 0x1e7c,\r
+ 0x1e7e, 0x1e7e,\r
+ 0x1e80, 0x1e80,\r
+ 0x1e82, 0x1e82,\r
+ 0x1e84, 0x1e84,\r
+ 0x1e86, 0x1e86,\r
+ 0x1e88, 0x1e88,\r
+ 0x1e8a, 0x1e8a,\r
+ 0x1e8c, 0x1e8c,\r
+ 0x1e8e, 0x1e8e,\r
+ 0x1e90, 0x1e90,\r
+ 0x1e92, 0x1e92,\r
+ 0x1e94, 0x1e94,\r
+ 0x1ea0, 0x1ea0,\r
+ 0x1ea2, 0x1ea2,\r
+ 0x1ea4, 0x1ea4,\r
+ 0x1ea6, 0x1ea6,\r
+ 0x1ea8, 0x1ea8,\r
+ 0x1eaa, 0x1eaa,\r
+ 0x1eac, 0x1eac,\r
+ 0x1eae, 0x1eae,\r
+ 0x1eb0, 0x1eb0,\r
+ 0x1eb2, 0x1eb2,\r
+ 0x1eb4, 0x1eb4,\r
+ 0x1eb6, 0x1eb6,\r
+ 0x1eb8, 0x1eb8,\r
+ 0x1eba, 0x1eba,\r
+ 0x1ebc, 0x1ebc,\r
+ 0x1ebe, 0x1ebe,\r
+ 0x1ec0, 0x1ec0,\r
+ 0x1ec2, 0x1ec2,\r
+ 0x1ec4, 0x1ec4,\r
+ 0x1ec6, 0x1ec6,\r
+ 0x1ec8, 0x1ec8,\r
+ 0x1eca, 0x1eca,\r
+ 0x1ecc, 0x1ecc,\r
+ 0x1ece, 0x1ece,\r
+ 0x1ed0, 0x1ed0,\r
+ 0x1ed2, 0x1ed2,\r
+ 0x1ed4, 0x1ed4,\r
+ 0x1ed6, 0x1ed6,\r
+ 0x1ed8, 0x1ed8,\r
+ 0x1eda, 0x1eda,\r
+ 0x1edc, 0x1edc,\r
+ 0x1ede, 0x1ede,\r
+ 0x1ee0, 0x1ee0,\r
+ 0x1ee2, 0x1ee2,\r
+ 0x1ee4, 0x1ee4,\r
+ 0x1ee6, 0x1ee6,\r
+ 0x1ee8, 0x1ee8,\r
+ 0x1eea, 0x1eea,\r
+ 0x1eec, 0x1eec,\r
+ 0x1eee, 0x1eee,\r
+ 0x1ef0, 0x1ef0,\r
+ 0x1ef2, 0x1ef2,\r
+ 0x1ef4, 0x1ef4,\r
+ 0x1ef6, 0x1ef6,\r
+ 0x1ef8, 0x1ef8,\r
+ 0x1f08, 0x1f0f,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f28, 0x1f2f,\r
+ 0x1f38, 0x1f3f,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f5f,\r
+ 0x1f68, 0x1f6f,\r
+ 0x1fb8, 0x1fbb,\r
+ 0x1fc8, 0x1fcb,\r
+ 0x1fd8, 0x1fdb,\r
+ 0x1fe8, 0x1fec,\r
+ 0x1ff8, 0x1ffb,\r
+ 0x2102, 0x2102,\r
+ 0x2107, 0x2107,\r
+ 0x210b, 0x210d,\r
+ 0x2110, 0x2112,\r
+ 0x2115, 0x2115,\r
+ 0x2119, 0x211d,\r
+ 0x2124, 0x2124,\r
+ 0x2126, 0x2126,\r
+ 0x2128, 0x2128,\r
+ 0x212a, 0x212d,\r
+ 0x2130, 0x2131,\r
+ 0x2133, 0x2133,\r
+ 0x213e, 0x213f,\r
+ 0x2145, 0x2145,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c80, 0x2c80,\r
+ 0x2c82, 0x2c82,\r
+ 0x2c84, 0x2c84,\r
+ 0x2c86, 0x2c86,\r
+ 0x2c88, 0x2c88,\r
+ 0x2c8a, 0x2c8a,\r
+ 0x2c8c, 0x2c8c,\r
+ 0x2c8e, 0x2c8e,\r
+ 0x2c90, 0x2c90,\r
+ 0x2c92, 0x2c92,\r
+ 0x2c94, 0x2c94,\r
+ 0x2c96, 0x2c96,\r
+ 0x2c98, 0x2c98,\r
+ 0x2c9a, 0x2c9a,\r
+ 0x2c9c, 0x2c9c,\r
+ 0x2c9e, 0x2c9e,\r
+ 0x2ca0, 0x2ca0,\r
+ 0x2ca2, 0x2ca2,\r
+ 0x2ca4, 0x2ca4,\r
+ 0x2ca6, 0x2ca6,\r
+ 0x2ca8, 0x2ca8,\r
+ 0x2caa, 0x2caa,\r
+ 0x2cac, 0x2cac,\r
+ 0x2cae, 0x2cae,\r
+ 0x2cb0, 0x2cb0,\r
+ 0x2cb2, 0x2cb2,\r
+ 0x2cb4, 0x2cb4,\r
+ 0x2cb6, 0x2cb6,\r
+ 0x2cb8, 0x2cb8,\r
+ 0x2cba, 0x2cba,\r
+ 0x2cbc, 0x2cbc,\r
+ 0x2cbe, 0x2cbe,\r
+ 0x2cc0, 0x2cc0,\r
+ 0x2cc2, 0x2cc2,\r
+ 0x2cc4, 0x2cc4,\r
+ 0x2cc6, 0x2cc6,\r
+ 0x2cc8, 0x2cc8,\r
+ 0x2cca, 0x2cca,\r
+ 0x2ccc, 0x2ccc,\r
+ 0x2cce, 0x2cce,\r
+ 0x2cd0, 0x2cd0,\r
+ 0x2cd2, 0x2cd2,\r
+ 0x2cd4, 0x2cd4,\r
+ 0x2cd6, 0x2cd6,\r
+ 0x2cd8, 0x2cd8,\r
+ 0x2cda, 0x2cda,\r
+ 0x2cdc, 0x2cdc,\r
+ 0x2cde, 0x2cde,\r
+ 0x2ce0, 0x2ce0,\r
+ 0x2ce2, 0x2ce2,\r
+ 0xff21, 0xff3a,\r
+ 0x10400, 0x10427,\r
+ 0x1d400, 0x1d419,\r
+ 0x1d434, 0x1d44d,\r
+ 0x1d468, 0x1d481,\r
+ 0x1d49c, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b5,\r
+ 0x1d4d0, 0x1d4e9,\r
+ 0x1d504, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d538, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d56c, 0x1d585,\r
+ 0x1d5a0, 0x1d5b9,\r
+ 0x1d5d4, 0x1d5ed,\r
+ 0x1d608, 0x1d621,\r
+ 0x1d63c, 0x1d655,\r
+ 0x1d670, 0x1d689,\r
+ 0x1d6a8, 0x1d6c0,\r
+ 0x1d6e2, 0x1d6fa,\r
+ 0x1d71c, 0x1d734,\r
+ 0x1d756, 0x1d76e,\r
+ 0x1d790, 0x1d7a8\r
+}; /* CR_Lu */\r
+\r
+/* 'M': Major Category */\r
+static const OnigCodePoint CR_M[] = {\r
+ 133,\r
+ 0x0300, 0x036f,\r
+ 0x0483, 0x0486,\r
+ 0x0488, 0x0489,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05bd,\r
+ 0x05bf, 0x05bf,\r
+ 0x05c1, 0x05c2,\r
+ 0x05c4, 0x05c5,\r
+ 0x05c7, 0x05c7,\r
+ 0x0610, 0x0615,\r
+ 0x064b, 0x065e,\r
+ 0x0670, 0x0670,\r
+ 0x06d6, 0x06dc,\r
+ 0x06de, 0x06e4,\r
+ 0x06e7, 0x06e8,\r
+ 0x06ea, 0x06ed,\r
+ 0x0711, 0x0711,\r
+ 0x0730, 0x074a,\r
+ 0x07a6, 0x07b0,\r
+ 0x0901, 0x0903,\r
+ 0x093c, 0x093c,\r
+ 0x093e, 0x094d,\r
+ 0x0951, 0x0954,\r
+ 0x0962, 0x0963,\r
+ 0x0981, 0x0983,\r
+ 0x09bc, 0x09bc,\r
+ 0x09be, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09cd,\r
+ 0x09d7, 0x09d7,\r
+ 0x09e2, 0x09e3,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a70, 0x0a71,\r
+ 0x0a81, 0x0a83,\r
+ 0x0abc, 0x0abc,\r
+ 0x0abe, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ae2, 0x0ae3,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b3c, 0x0b3c,\r
+ 0x0b3e, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b82, 0x0b82,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c82, 0x0c83,\r
+ 0x0cbc, 0x0cbc,\r
+ 0x0cbe, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d82, 0x0d83,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df3,\r
+ 0x0e31, 0x0e31,\r
+ 0x0e34, 0x0e3a,\r
+ 0x0e47, 0x0e4e,\r
+ 0x0eb1, 0x0eb1,\r
+ 0x0eb4, 0x0eb9,\r
+ 0x0ebb, 0x0ebc,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0f18, 0x0f19,\r
+ 0x0f35, 0x0f35,\r
+ 0x0f37, 0x0f37,\r
+ 0x0f39, 0x0f39,\r
+ 0x0f3e, 0x0f3f,\r
+ 0x0f71, 0x0f84,\r
+ 0x0f86, 0x0f87,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fc6, 0x0fc6,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1056, 0x1059,\r
+ 0x135f, 0x135f,\r
+ 0x1712, 0x1714,\r
+ 0x1732, 0x1734,\r
+ 0x1752, 0x1753,\r
+ 0x1772, 0x1773,\r
+ 0x17b6, 0x17d3,\r
+ 0x17dd, 0x17dd,\r
+ 0x180b, 0x180d,\r
+ 0x18a9, 0x18a9,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x19b0, 0x19c0,\r
+ 0x19c8, 0x19c9,\r
+ 0x1a17, 0x1a1b,\r
+ 0x1dc0, 0x1dc3,\r
+ 0x20d0, 0x20eb,\r
+ 0x302a, 0x302f,\r
+ 0x3099, 0x309a,\r
+ 0xa802, 0xa802,\r
+ 0xa806, 0xa806,\r
+ 0xa80b, 0xa80b,\r
+ 0xa823, 0xa827,\r
+ 0xfb1e, 0xfb1e,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0x10a01, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a0f,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a3f,\r
+ 0x1d165, 0x1d169,\r
+ 0x1d16d, 0x1d172,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0x1d242, 0x1d244,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_M */\r
+\r
+/* 'Mc': General Category */\r
+static const OnigCodePoint CR_Mc[] = {\r
+ 63,\r
+ 0x0903, 0x0903,\r
+ 0x093e, 0x0940,\r
+ 0x0949, 0x094c,\r
+ 0x0982, 0x0983,\r
+ 0x09be, 0x09c0,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09cc,\r
+ 0x09d7, 0x09d7,\r
+ 0x0a03, 0x0a03,\r
+ 0x0a3e, 0x0a40,\r
+ 0x0a83, 0x0a83,\r
+ 0x0abe, 0x0ac0,\r
+ 0x0ac9, 0x0ac9,\r
+ 0x0acb, 0x0acc,\r
+ 0x0b02, 0x0b03,\r
+ 0x0b3e, 0x0b3e,\r
+ 0x0b40, 0x0b40,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4c,\r
+ 0x0b57, 0x0b57,\r
+ 0x0bbe, 0x0bbf,\r
+ 0x0bc1, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcc,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c41, 0x0c44,\r
+ 0x0c82, 0x0c83,\r
+ 0x0cbe, 0x0cbe,\r
+ 0x0cc0, 0x0cc4,\r
+ 0x0cc7, 0x0cc8,\r
+ 0x0cca, 0x0ccb,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d3e, 0x0d40,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4c,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d82, 0x0d83,\r
+ 0x0dcf, 0x0dd1,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df3,\r
+ 0x0f3e, 0x0f3f,\r
+ 0x0f7f, 0x0f7f,\r
+ 0x102c, 0x102c,\r
+ 0x1031, 0x1031,\r
+ 0x1038, 0x1038,\r
+ 0x1056, 0x1057,\r
+ 0x17b6, 0x17b6,\r
+ 0x17be, 0x17c5,\r
+ 0x17c7, 0x17c8,\r
+ 0x1923, 0x1926,\r
+ 0x1929, 0x192b,\r
+ 0x1930, 0x1931,\r
+ 0x1933, 0x1938,\r
+ 0x19b0, 0x19c0,\r
+ 0x19c8, 0x19c9,\r
+ 0x1a19, 0x1a1b,\r
+ 0xa802, 0xa802,\r
+ 0xa823, 0xa824,\r
+ 0xa827, 0xa827,\r
+ 0x1d165, 0x1d166,\r
+ 0x1d16d, 0x1d172\r
+}; /* CR_Mc */\r
+\r
+/* 'Me': General Category */\r
+static const OnigCodePoint CR_Me[] = {\r
+ 4,\r
+ 0x0488, 0x0489,\r
+ 0x06de, 0x06de,\r
+ 0x20dd, 0x20e0,\r
+ 0x20e2, 0x20e4\r
+}; /* CR_Me */\r
+\r
+/* 'Mn': General Category */\r
+static const OnigCodePoint CR_Mn[] = {\r
+ 124,\r
+ 0x0300, 0x036f,\r
+ 0x0483, 0x0486,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05bd,\r
+ 0x05bf, 0x05bf,\r
+ 0x05c1, 0x05c2,\r
+ 0x05c4, 0x05c5,\r
+ 0x05c7, 0x05c7,\r
+ 0x0610, 0x0615,\r
+ 0x064b, 0x065e,\r
+ 0x0670, 0x0670,\r
+ 0x06d6, 0x06dc,\r
+ 0x06df, 0x06e4,\r
+ 0x06e7, 0x06e8,\r
+ 0x06ea, 0x06ed,\r
+ 0x0711, 0x0711,\r
+ 0x0730, 0x074a,\r
+ 0x07a6, 0x07b0,\r
+ 0x0901, 0x0902,\r
+ 0x093c, 0x093c,\r
+ 0x0941, 0x0948,\r
+ 0x094d, 0x094d,\r
+ 0x0951, 0x0954,\r
+ 0x0962, 0x0963,\r
+ 0x0981, 0x0981,\r
+ 0x09bc, 0x09bc,\r
+ 0x09c1, 0x09c4,\r
+ 0x09cd, 0x09cd,\r
+ 0x09e2, 0x09e3,\r
+ 0x0a01, 0x0a02,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a41, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a70, 0x0a71,\r
+ 0x0a81, 0x0a82,\r
+ 0x0abc, 0x0abc,\r
+ 0x0ac1, 0x0ac5,\r
+ 0x0ac7, 0x0ac8,\r
+ 0x0acd, 0x0acd,\r
+ 0x0ae2, 0x0ae3,\r
+ 0x0b01, 0x0b01,\r
+ 0x0b3c, 0x0b3c,\r
+ 0x0b3f, 0x0b3f,\r
+ 0x0b41, 0x0b43,\r
+ 0x0b4d, 0x0b4d,\r
+ 0x0b56, 0x0b56,\r
+ 0x0b82, 0x0b82,\r
+ 0x0bc0, 0x0bc0,\r
+ 0x0bcd, 0x0bcd,\r
+ 0x0c3e, 0x0c40,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0cbc, 0x0cbc,\r
+ 0x0cbf, 0x0cbf,\r
+ 0x0cc6, 0x0cc6,\r
+ 0x0ccc, 0x0ccd,\r
+ 0x0d41, 0x0d43,\r
+ 0x0d4d, 0x0d4d,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dd2, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0e31, 0x0e31,\r
+ 0x0e34, 0x0e3a,\r
+ 0x0e47, 0x0e4e,\r
+ 0x0eb1, 0x0eb1,\r
+ 0x0eb4, 0x0eb9,\r
+ 0x0ebb, 0x0ebc,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0f18, 0x0f19,\r
+ 0x0f35, 0x0f35,\r
+ 0x0f37, 0x0f37,\r
+ 0x0f39, 0x0f39,\r
+ 0x0f71, 0x0f7e,\r
+ 0x0f80, 0x0f84,\r
+ 0x0f86, 0x0f87,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fc6, 0x0fc6,\r
+ 0x102d, 0x1030,\r
+ 0x1032, 0x1032,\r
+ 0x1036, 0x1037,\r
+ 0x1039, 0x1039,\r
+ 0x1058, 0x1059,\r
+ 0x135f, 0x135f,\r
+ 0x1712, 0x1714,\r
+ 0x1732, 0x1734,\r
+ 0x1752, 0x1753,\r
+ 0x1772, 0x1773,\r
+ 0x17b7, 0x17bd,\r
+ 0x17c6, 0x17c6,\r
+ 0x17c9, 0x17d3,\r
+ 0x17dd, 0x17dd,\r
+ 0x180b, 0x180d,\r
+ 0x18a9, 0x18a9,\r
+ 0x1920, 0x1922,\r
+ 0x1927, 0x1928,\r
+ 0x1932, 0x1932,\r
+ 0x1939, 0x193b,\r
+ 0x1a17, 0x1a18,\r
+ 0x1dc0, 0x1dc3,\r
+ 0x20d0, 0x20dc,\r
+ 0x20e1, 0x20e1,\r
+ 0x20e5, 0x20eb,\r
+ 0x302a, 0x302f,\r
+ 0x3099, 0x309a,\r
+ 0xa806, 0xa806,\r
+ 0xa80b, 0xa80b,\r
+ 0xa825, 0xa826,\r
+ 0xfb1e, 0xfb1e,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0x10a01, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a0f,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a3f,\r
+ 0x1d167, 0x1d169,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0x1d242, 0x1d244,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_Mn */\r
+\r
+/* 'N': Major Category */\r
+static const OnigCodePoint CR_N[] = {\r
+ 53,\r
+ 0x0030, 0x0039,\r
+ 0x00b2, 0x00b3,\r
+ 0x00b9, 0x00b9,\r
+ 0x00bc, 0x00be,\r
+ 0x0660, 0x0669,\r
+ 0x06f0, 0x06f9,\r
+ 0x0966, 0x096f,\r
+ 0x09e6, 0x09ef,\r
+ 0x09f4, 0x09f9,\r
+ 0x0a66, 0x0a6f,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0b66, 0x0b6f,\r
+ 0x0be6, 0x0bf2,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0e50, 0x0e59,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0f20, 0x0f33,\r
+ 0x1040, 0x1049,\r
+ 0x1369, 0x137c,\r
+ 0x16ee, 0x16f0,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x1810, 0x1819,\r
+ 0x1946, 0x194f,\r
+ 0x19d0, 0x19d9,\r
+ 0x2070, 0x2070,\r
+ 0x2074, 0x2079,\r
+ 0x2080, 0x2089,\r
+ 0x2153, 0x2183,\r
+ 0x2460, 0x249b,\r
+ 0x24ea, 0x24ff,\r
+ 0x2776, 0x2793,\r
+ 0x2cfd, 0x2cfd,\r
+ 0x3007, 0x3007,\r
+ 0x3021, 0x3029,\r
+ 0x3038, 0x303a,\r
+ 0x3192, 0x3195,\r
+ 0x3220, 0x3229,\r
+ 0x3251, 0x325f,\r
+ 0x3280, 0x3289,\r
+ 0x32b1, 0x32bf,\r
+ 0xff10, 0xff19,\r
+ 0x10107, 0x10133,\r
+ 0x10140, 0x10178,\r
+ 0x1018a, 0x1018a,\r
+ 0x10320, 0x10323,\r
+ 0x1034a, 0x1034a,\r
+ 0x103d1, 0x103d5,\r
+ 0x104a0, 0x104a9,\r
+ 0x10a40, 0x10a47,\r
+ 0x1d7ce, 0x1d7ff\r
+}; /* CR_N */\r
+\r
+/* 'Nd': General Category */\r
+static const OnigCodePoint CR_Nd[] = {\r
+ 23,\r
+ 0x0030, 0x0039,\r
+ 0x0660, 0x0669,\r
+ 0x06f0, 0x06f9,\r
+ 0x0966, 0x096f,\r
+ 0x09e6, 0x09ef,\r
+ 0x0a66, 0x0a6f,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0b66, 0x0b6f,\r
+ 0x0be6, 0x0bef,\r
+ 0x0c66, 0x0c6f,\r
+ 0x0ce6, 0x0cef,\r
+ 0x0d66, 0x0d6f,\r
+ 0x0e50, 0x0e59,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0f20, 0x0f29,\r
+ 0x1040, 0x1049,\r
+ 0x17e0, 0x17e9,\r
+ 0x1810, 0x1819,\r
+ 0x1946, 0x194f,\r
+ 0x19d0, 0x19d9,\r
+ 0xff10, 0xff19,\r
+ 0x104a0, 0x104a9,\r
+ 0x1d7ce, 0x1d7ff\r
+}; /* CR_Nd */\r
+\r
+/* 'Nl': General Category */\r
+static const OnigCodePoint CR_Nl[] = {\r
+ 8,\r
+ 0x16ee, 0x16f0,\r
+ 0x2160, 0x2183,\r
+ 0x3007, 0x3007,\r
+ 0x3021, 0x3029,\r
+ 0x3038, 0x303a,\r
+ 0x10140, 0x10174,\r
+ 0x1034a, 0x1034a,\r
+ 0x103d1, 0x103d5\r
+}; /* CR_Nl */\r
+\r
+/* 'No': General Category */\r
+static const OnigCodePoint CR_No[] = {\r
+ 26,\r
+ 0x00b2, 0x00b3,\r
+ 0x00b9, 0x00b9,\r
+ 0x00bc, 0x00be,\r
+ 0x09f4, 0x09f9,\r
+ 0x0bf0, 0x0bf2,\r
+ 0x0f2a, 0x0f33,\r
+ 0x1369, 0x137c,\r
+ 0x17f0, 0x17f9,\r
+ 0x2070, 0x2070,\r
+ 0x2074, 0x2079,\r
+ 0x2080, 0x2089,\r
+ 0x2153, 0x215f,\r
+ 0x2460, 0x249b,\r
+ 0x24ea, 0x24ff,\r
+ 0x2776, 0x2793,\r
+ 0x2cfd, 0x2cfd,\r
+ 0x3192, 0x3195,\r
+ 0x3220, 0x3229,\r
+ 0x3251, 0x325f,\r
+ 0x3280, 0x3289,\r
+ 0x32b1, 0x32bf,\r
+ 0x10107, 0x10133,\r
+ 0x10175, 0x10178,\r
+ 0x1018a, 0x1018a,\r
+ 0x10320, 0x10323,\r
+ 0x10a40, 0x10a47\r
+}; /* CR_No */\r
+\r
+/* 'P': Major Category */\r
+static const OnigCodePoint CR_P[] = {\r
+ 96,\r
+ 0x0021, 0x0023,\r
+ 0x0025, 0x002a,\r
+ 0x002c, 0x002f,\r
+ 0x003a, 0x003b,\r
+ 0x003f, 0x0040,\r
+ 0x005b, 0x005d,\r
+ 0x005f, 0x005f,\r
+ 0x007b, 0x007b,\r
+ 0x007d, 0x007d,\r
+ 0x00a1, 0x00a1,\r
+ 0x00ab, 0x00ab,\r
+ 0x00b7, 0x00b7,\r
+ 0x00bb, 0x00bb,\r
+ 0x00bf, 0x00bf,\r
+ 0x037e, 0x037e,\r
+ 0x0387, 0x0387,\r
+ 0x055a, 0x055f,\r
+ 0x0589, 0x058a,\r
+ 0x05be, 0x05be,\r
+ 0x05c0, 0x05c0,\r
+ 0x05c3, 0x05c3,\r
+ 0x05c6, 0x05c6,\r
+ 0x05f3, 0x05f4,\r
+ 0x060c, 0x060d,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x066a, 0x066d,\r
+ 0x06d4, 0x06d4,\r
+ 0x0700, 0x070d,\r
+ 0x0964, 0x0965,\r
+ 0x0970, 0x0970,\r
+ 0x0df4, 0x0df4,\r
+ 0x0e4f, 0x0e4f,\r
+ 0x0e5a, 0x0e5b,\r
+ 0x0f04, 0x0f12,\r
+ 0x0f3a, 0x0f3d,\r
+ 0x0f85, 0x0f85,\r
+ 0x0fd0, 0x0fd1,\r
+ 0x104a, 0x104f,\r
+ 0x10fb, 0x10fb,\r
+ 0x1361, 0x1368,\r
+ 0x166d, 0x166e,\r
+ 0x169b, 0x169c,\r
+ 0x16eb, 0x16ed,\r
+ 0x1735, 0x1736,\r
+ 0x17d4, 0x17d6,\r
+ 0x17d8, 0x17da,\r
+ 0x1800, 0x180a,\r
+ 0x1944, 0x1945,\r
+ 0x19de, 0x19df,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x2010, 0x2027,\r
+ 0x2030, 0x2043,\r
+ 0x2045, 0x2051,\r
+ 0x2053, 0x205e,\r
+ 0x207d, 0x207e,\r
+ 0x208d, 0x208e,\r
+ 0x2329, 0x232a,\r
+ 0x23b4, 0x23b6,\r
+ 0x2768, 0x2775,\r
+ 0x27c5, 0x27c6,\r
+ 0x27e6, 0x27eb,\r
+ 0x2983, 0x2998,\r
+ 0x29d8, 0x29db,\r
+ 0x29fc, 0x29fd,\r
+ 0x2cf9, 0x2cfc,\r
+ 0x2cfe, 0x2cff,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x3001, 0x3003,\r
+ 0x3008, 0x3011,\r
+ 0x3014, 0x301f,\r
+ 0x3030, 0x3030,\r
+ 0x303d, 0x303d,\r
+ 0x30a0, 0x30a0,\r
+ 0x30fb, 0x30fb,\r
+ 0xfd3e, 0xfd3f,\r
+ 0xfe10, 0xfe19,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe61,\r
+ 0xfe63, 0xfe63,\r
+ 0xfe68, 0xfe68,\r
+ 0xfe6a, 0xfe6b,\r
+ 0xff01, 0xff03,\r
+ 0xff05, 0xff0a,\r
+ 0xff0c, 0xff0f,\r
+ 0xff1a, 0xff1b,\r
+ 0xff1f, 0xff20,\r
+ 0xff3b, 0xff3d,\r
+ 0xff3f, 0xff3f,\r
+ 0xff5b, 0xff5b,\r
+ 0xff5d, 0xff5d,\r
+ 0xff5f, 0xff65,\r
+ 0x10100, 0x10101,\r
+ 0x1039f, 0x1039f,\r
+ 0x10a50, 0x10a58\r
+}; /* CR_P */\r
+\r
+/* 'Pc': General Category */\r
+static const OnigCodePoint CR_Pc[] = {\r
+ 6,\r
+ 0x005f, 0x005f,\r
+ 0x203f, 0x2040,\r
+ 0x2054, 0x2054,\r
+ 0xfe33, 0xfe34,\r
+ 0xfe4d, 0xfe4f,\r
+ 0xff3f, 0xff3f\r
+}; /* CR_Pc */\r
+\r
+/* 'Pd': General Category */\r
+static const OnigCodePoint CR_Pd[] = {\r
+ 12,\r
+ 0x002d, 0x002d,\r
+ 0x058a, 0x058a,\r
+ 0x1806, 0x1806,\r
+ 0x2010, 0x2015,\r
+ 0x2e17, 0x2e17,\r
+ 0x301c, 0x301c,\r
+ 0x3030, 0x3030,\r
+ 0x30a0, 0x30a0,\r
+ 0xfe31, 0xfe32,\r
+ 0xfe58, 0xfe58,\r
+ 0xfe63, 0xfe63,\r
+ 0xff0d, 0xff0d\r
+}; /* CR_Pd */\r
+\r
+/* 'Pe': General Category */\r
+static const OnigCodePoint CR_Pe[] = {\r
+ 65,\r
+ 0x0029, 0x0029,\r
+ 0x005d, 0x005d,\r
+ 0x007d, 0x007d,\r
+ 0x0f3b, 0x0f3b,\r
+ 0x0f3d, 0x0f3d,\r
+ 0x169c, 0x169c,\r
+ 0x2046, 0x2046,\r
+ 0x207e, 0x207e,\r
+ 0x208e, 0x208e,\r
+ 0x232a, 0x232a,\r
+ 0x23b5, 0x23b5,\r
+ 0x2769, 0x2769,\r
+ 0x276b, 0x276b,\r
+ 0x276d, 0x276d,\r
+ 0x276f, 0x276f,\r
+ 0x2771, 0x2771,\r
+ 0x2773, 0x2773,\r
+ 0x2775, 0x2775,\r
+ 0x27c6, 0x27c6,\r
+ 0x27e7, 0x27e7,\r
+ 0x27e9, 0x27e9,\r
+ 0x27eb, 0x27eb,\r
+ 0x2984, 0x2984,\r
+ 0x2986, 0x2986,\r
+ 0x2988, 0x2988,\r
+ 0x298a, 0x298a,\r
+ 0x298c, 0x298c,\r
+ 0x298e, 0x298e,\r
+ 0x2990, 0x2990,\r
+ 0x2992, 0x2992,\r
+ 0x2994, 0x2994,\r
+ 0x2996, 0x2996,\r
+ 0x2998, 0x2998,\r
+ 0x29d9, 0x29d9,\r
+ 0x29db, 0x29db,\r
+ 0x29fd, 0x29fd,\r
+ 0x3009, 0x3009,\r
+ 0x300b, 0x300b,\r
+ 0x300d, 0x300d,\r
+ 0x300f, 0x300f,\r
+ 0x3011, 0x3011,\r
+ 0x3015, 0x3015,\r
+ 0x3017, 0x3017,\r
+ 0x3019, 0x3019,\r
+ 0x301b, 0x301b,\r
+ 0x301e, 0x301f,\r
+ 0xfd3f, 0xfd3f,\r
+ 0xfe18, 0xfe18,\r
+ 0xfe36, 0xfe36,\r
+ 0xfe38, 0xfe38,\r
+ 0xfe3a, 0xfe3a,\r
+ 0xfe3c, 0xfe3c,\r
+ 0xfe3e, 0xfe3e,\r
+ 0xfe40, 0xfe40,\r
+ 0xfe42, 0xfe42,\r
+ 0xfe44, 0xfe44,\r
+ 0xfe48, 0xfe48,\r
+ 0xfe5a, 0xfe5a,\r
+ 0xfe5c, 0xfe5c,\r
+ 0xfe5e, 0xfe5e,\r
+ 0xff09, 0xff09,\r
+ 0xff3d, 0xff3d,\r
+ 0xff5d, 0xff5d,\r
+ 0xff60, 0xff60,\r
+ 0xff63, 0xff63\r
+}; /* CR_Pe */\r
+\r
+/* 'Pf': General Category */\r
+static const OnigCodePoint CR_Pf[] = {\r
+ 9,\r
+ 0x00bb, 0x00bb,\r
+ 0x2019, 0x2019,\r
+ 0x201d, 0x201d,\r
+ 0x203a, 0x203a,\r
+ 0x2e03, 0x2e03,\r
+ 0x2e05, 0x2e05,\r
+ 0x2e0a, 0x2e0a,\r
+ 0x2e0d, 0x2e0d,\r
+ 0x2e1d, 0x2e1d\r
+}; /* CR_Pf */\r
+\r
+/* 'Pi': General Category */\r
+static const OnigCodePoint CR_Pi[] = {\r
+ 10,\r
+ 0x00ab, 0x00ab,\r
+ 0x2018, 0x2018,\r
+ 0x201b, 0x201c,\r
+ 0x201f, 0x201f,\r
+ 0x2039, 0x2039,\r
+ 0x2e02, 0x2e02,\r
+ 0x2e04, 0x2e04,\r
+ 0x2e09, 0x2e09,\r
+ 0x2e0c, 0x2e0c,\r
+ 0x2e1c, 0x2e1c\r
+}; /* CR_Pi */\r
+\r
+/* 'Po': General Category */\r
+static const OnigCodePoint CR_Po[] = {\r
+ 88,\r
+ 0x0021, 0x0023,\r
+ 0x0025, 0x0027,\r
+ 0x002a, 0x002a,\r
+ 0x002c, 0x002c,\r
+ 0x002e, 0x002f,\r
+ 0x003a, 0x003b,\r
+ 0x003f, 0x0040,\r
+ 0x005c, 0x005c,\r
+ 0x00a1, 0x00a1,\r
+ 0x00b7, 0x00b7,\r
+ 0x00bf, 0x00bf,\r
+ 0x037e, 0x037e,\r
+ 0x0387, 0x0387,\r
+ 0x055a, 0x055f,\r
+ 0x0589, 0x0589,\r
+ 0x05be, 0x05be,\r
+ 0x05c0, 0x05c0,\r
+ 0x05c3, 0x05c3,\r
+ 0x05c6, 0x05c6,\r
+ 0x05f3, 0x05f4,\r
+ 0x060c, 0x060d,\r
+ 0x061b, 0x061b,\r
+ 0x061e, 0x061f,\r
+ 0x066a, 0x066d,\r
+ 0x06d4, 0x06d4,\r
+ 0x0700, 0x070d,\r
+ 0x0964, 0x0965,\r
+ 0x0970, 0x0970,\r
+ 0x0df4, 0x0df4,\r
+ 0x0e4f, 0x0e4f,\r
+ 0x0e5a, 0x0e5b,\r
+ 0x0f04, 0x0f12,\r
+ 0x0f85, 0x0f85,\r
+ 0x0fd0, 0x0fd1,\r
+ 0x104a, 0x104f,\r
+ 0x10fb, 0x10fb,\r
+ 0x1361, 0x1368,\r
+ 0x166d, 0x166e,\r
+ 0x16eb, 0x16ed,\r
+ 0x1735, 0x1736,\r
+ 0x17d4, 0x17d6,\r
+ 0x17d8, 0x17da,\r
+ 0x1800, 0x1805,\r
+ 0x1807, 0x180a,\r
+ 0x1944, 0x1945,\r
+ 0x19de, 0x19df,\r
+ 0x1a1e, 0x1a1f,\r
+ 0x2016, 0x2017,\r
+ 0x2020, 0x2027,\r
+ 0x2030, 0x2038,\r
+ 0x203b, 0x203e,\r
+ 0x2041, 0x2043,\r
+ 0x2047, 0x2051,\r
+ 0x2053, 0x2053,\r
+ 0x2055, 0x205e,\r
+ 0x23b6, 0x23b6,\r
+ 0x2cf9, 0x2cfc,\r
+ 0x2cfe, 0x2cff,\r
+ 0x2e00, 0x2e01,\r
+ 0x2e06, 0x2e08,\r
+ 0x2e0b, 0x2e0b,\r
+ 0x2e0e, 0x2e16,\r
+ 0x3001, 0x3003,\r
+ 0x303d, 0x303d,\r
+ 0x30fb, 0x30fb,\r
+ 0xfe10, 0xfe16,\r
+ 0xfe19, 0xfe19,\r
+ 0xfe30, 0xfe30,\r
+ 0xfe45, 0xfe46,\r
+ 0xfe49, 0xfe4c,\r
+ 0xfe50, 0xfe52,\r
+ 0xfe54, 0xfe57,\r
+ 0xfe5f, 0xfe61,\r
+ 0xfe68, 0xfe68,\r
+ 0xfe6a, 0xfe6b,\r
+ 0xff01, 0xff03,\r
+ 0xff05, 0xff07,\r
+ 0xff0a, 0xff0a,\r
+ 0xff0c, 0xff0c,\r
+ 0xff0e, 0xff0f,\r
+ 0xff1a, 0xff1b,\r
+ 0xff1f, 0xff20,\r
+ 0xff3c, 0xff3c,\r
+ 0xff61, 0xff61,\r
+ 0xff64, 0xff65,\r
+ 0x10100, 0x10101,\r
+ 0x1039f, 0x1039f,\r
+ 0x10a50, 0x10a58\r
+}; /* CR_Po */\r
+\r
+/* 'Ps': General Category */\r
+static const OnigCodePoint CR_Ps[] = {\r
+ 67,\r
+ 0x0028, 0x0028,\r
+ 0x005b, 0x005b,\r
+ 0x007b, 0x007b,\r
+ 0x0f3a, 0x0f3a,\r
+ 0x0f3c, 0x0f3c,\r
+ 0x169b, 0x169b,\r
+ 0x201a, 0x201a,\r
+ 0x201e, 0x201e,\r
+ 0x2045, 0x2045,\r
+ 0x207d, 0x207d,\r
+ 0x208d, 0x208d,\r
+ 0x2329, 0x2329,\r
+ 0x23b4, 0x23b4,\r
+ 0x2768, 0x2768,\r
+ 0x276a, 0x276a,\r
+ 0x276c, 0x276c,\r
+ 0x276e, 0x276e,\r
+ 0x2770, 0x2770,\r
+ 0x2772, 0x2772,\r
+ 0x2774, 0x2774,\r
+ 0x27c5, 0x27c5,\r
+ 0x27e6, 0x27e6,\r
+ 0x27e8, 0x27e8,\r
+ 0x27ea, 0x27ea,\r
+ 0x2983, 0x2983,\r
+ 0x2985, 0x2985,\r
+ 0x2987, 0x2987,\r
+ 0x2989, 0x2989,\r
+ 0x298b, 0x298b,\r
+ 0x298d, 0x298d,\r
+ 0x298f, 0x298f,\r
+ 0x2991, 0x2991,\r
+ 0x2993, 0x2993,\r
+ 0x2995, 0x2995,\r
+ 0x2997, 0x2997,\r
+ 0x29d8, 0x29d8,\r
+ 0x29da, 0x29da,\r
+ 0x29fc, 0x29fc,\r
+ 0x3008, 0x3008,\r
+ 0x300a, 0x300a,\r
+ 0x300c, 0x300c,\r
+ 0x300e, 0x300e,\r
+ 0x3010, 0x3010,\r
+ 0x3014, 0x3014,\r
+ 0x3016, 0x3016,\r
+ 0x3018, 0x3018,\r
+ 0x301a, 0x301a,\r
+ 0x301d, 0x301d,\r
+ 0xfd3e, 0xfd3e,\r
+ 0xfe17, 0xfe17,\r
+ 0xfe35, 0xfe35,\r
+ 0xfe37, 0xfe37,\r
+ 0xfe39, 0xfe39,\r
+ 0xfe3b, 0xfe3b,\r
+ 0xfe3d, 0xfe3d,\r
+ 0xfe3f, 0xfe3f,\r
+ 0xfe41, 0xfe41,\r
+ 0xfe43, 0xfe43,\r
+ 0xfe47, 0xfe47,\r
+ 0xfe59, 0xfe59,\r
+ 0xfe5b, 0xfe5b,\r
+ 0xfe5d, 0xfe5d,\r
+ 0xff08, 0xff08,\r
+ 0xff3b, 0xff3b,\r
+ 0xff5b, 0xff5b,\r
+ 0xff5f, 0xff5f,\r
+ 0xff62, 0xff62\r
+}; /* CR_Ps */\r
+\r
+/* 'S': Major Category */\r
+static const OnigCodePoint CR_S[] = {\r
+ 162,\r
+ 0x0024, 0x0024,\r
+ 0x002b, 0x002b,\r
+ 0x003c, 0x003e,\r
+ 0x005e, 0x005e,\r
+ 0x0060, 0x0060,\r
+ 0x007c, 0x007c,\r
+ 0x007e, 0x007e,\r
+ 0x00a2, 0x00a9,\r
+ 0x00ac, 0x00ac,\r
+ 0x00ae, 0x00b1,\r
+ 0x00b4, 0x00b4,\r
+ 0x00b6, 0x00b6,\r
+ 0x00b8, 0x00b8,\r
+ 0x00d7, 0x00d7,\r
+ 0x00f7, 0x00f7,\r
+ 0x02c2, 0x02c5,\r
+ 0x02d2, 0x02df,\r
+ 0x02e5, 0x02ed,\r
+ 0x02ef, 0x02ff,\r
+ 0x0374, 0x0375,\r
+ 0x0384, 0x0385,\r
+ 0x03f6, 0x03f6,\r
+ 0x0482, 0x0482,\r
+ 0x060b, 0x060b,\r
+ 0x060e, 0x060f,\r
+ 0x06e9, 0x06e9,\r
+ 0x06fd, 0x06fe,\r
+ 0x09f2, 0x09f3,\r
+ 0x09fa, 0x09fa,\r
+ 0x0af1, 0x0af1,\r
+ 0x0b70, 0x0b70,\r
+ 0x0bf3, 0x0bfa,\r
+ 0x0e3f, 0x0e3f,\r
+ 0x0f01, 0x0f03,\r
+ 0x0f13, 0x0f17,\r
+ 0x0f1a, 0x0f1f,\r
+ 0x0f34, 0x0f34,\r
+ 0x0f36, 0x0f36,\r
+ 0x0f38, 0x0f38,\r
+ 0x0fbe, 0x0fc5,\r
+ 0x0fc7, 0x0fcc,\r
+ 0x0fcf, 0x0fcf,\r
+ 0x1360, 0x1360,\r
+ 0x1390, 0x1399,\r
+ 0x17db, 0x17db,\r
+ 0x1940, 0x1940,\r
+ 0x19e0, 0x19ff,\r
+ 0x1fbd, 0x1fbd,\r
+ 0x1fbf, 0x1fc1,\r
+ 0x1fcd, 0x1fcf,\r
+ 0x1fdd, 0x1fdf,\r
+ 0x1fed, 0x1fef,\r
+ 0x1ffd, 0x1ffe,\r
+ 0x2044, 0x2044,\r
+ 0x2052, 0x2052,\r
+ 0x207a, 0x207c,\r
+ 0x208a, 0x208c,\r
+ 0x20a0, 0x20b5,\r
+ 0x2100, 0x2101,\r
+ 0x2103, 0x2106,\r
+ 0x2108, 0x2109,\r
+ 0x2114, 0x2114,\r
+ 0x2116, 0x2118,\r
+ 0x211e, 0x2123,\r
+ 0x2125, 0x2125,\r
+ 0x2127, 0x2127,\r
+ 0x2129, 0x2129,\r
+ 0x212e, 0x212e,\r
+ 0x2132, 0x2132,\r
+ 0x213a, 0x213b,\r
+ 0x2140, 0x2144,\r
+ 0x214a, 0x214c,\r
+ 0x2190, 0x2328,\r
+ 0x232b, 0x23b3,\r
+ 0x23b7, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x249c, 0x24e9,\r
+ 0x2500, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2767,\r
+ 0x2794, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x27c0, 0x27c4,\r
+ 0x27d0, 0x27e5,\r
+ 0x27f0, 0x2982,\r
+ 0x2999, 0x29d7,\r
+ 0x29dc, 0x29fb,\r
+ 0x29fe, 0x2b13,\r
+ 0x2ce5, 0x2cea,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3004, 0x3004,\r
+ 0x3012, 0x3013,\r
+ 0x3020, 0x3020,\r
+ 0x3036, 0x3037,\r
+ 0x303e, 0x303f,\r
+ 0x309b, 0x309c,\r
+ 0x3190, 0x3191,\r
+ 0x3196, 0x319f,\r
+ 0x31c0, 0x31cf,\r
+ 0x3200, 0x321e,\r
+ 0x322a, 0x3243,\r
+ 0x3250, 0x3250,\r
+ 0x3260, 0x327f,\r
+ 0x328a, 0x32b0,\r
+ 0x32c0, 0x32fe,\r
+ 0x3300, 0x33ff,\r
+ 0x4dc0, 0x4dff,\r
+ 0xa490, 0xa4c6,\r
+ 0xa700, 0xa716,\r
+ 0xa828, 0xa82b,\r
+ 0xfb29, 0xfb29,\r
+ 0xfdfc, 0xfdfd,\r
+ 0xfe62, 0xfe62,\r
+ 0xfe64, 0xfe66,\r
+ 0xfe69, 0xfe69,\r
+ 0xff04, 0xff04,\r
+ 0xff0b, 0xff0b,\r
+ 0xff1c, 0xff1e,\r
+ 0xff3e, 0xff3e,\r
+ 0xff40, 0xff40,\r
+ 0xff5c, 0xff5c,\r
+ 0xff5e, 0xff5e,\r
+ 0xffe0, 0xffe6,\r
+ 0xffe8, 0xffee,\r
+ 0xfffc, 0xfffd,\r
+ 0x10102, 0x10102,\r
+ 0x10137, 0x1013f,\r
+ 0x10179, 0x10189,\r
+ 0x103d0, 0x103d0,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d164,\r
+ 0x1d16a, 0x1d16c,\r
+ 0x1d183, 0x1d184,\r
+ 0x1d18c, 0x1d1a9,\r
+ 0x1d1ae, 0x1d1dd,\r
+ 0x1d200, 0x1d241,\r
+ 0x1d245, 0x1d245,\r
+ 0x1d300, 0x1d356,\r
+ 0x1d6c1, 0x1d6c1,\r
+ 0x1d6db, 0x1d6db,\r
+ 0x1d6fb, 0x1d6fb,\r
+ 0x1d715, 0x1d715,\r
+ 0x1d735, 0x1d735,\r
+ 0x1d74f, 0x1d74f,\r
+ 0x1d76f, 0x1d76f,\r
+ 0x1d789, 0x1d789,\r
+ 0x1d7a9, 0x1d7a9,\r
+ 0x1d7c3, 0x1d7c3\r
+}; /* CR_S */\r
+\r
+/* 'Sc': General Category */\r
+static const OnigCodePoint CR_Sc[] = {\r
+ 14,\r
+ 0x0024, 0x0024,\r
+ 0x00a2, 0x00a5,\r
+ 0x060b, 0x060b,\r
+ 0x09f2, 0x09f3,\r
+ 0x0af1, 0x0af1,\r
+ 0x0bf9, 0x0bf9,\r
+ 0x0e3f, 0x0e3f,\r
+ 0x17db, 0x17db,\r
+ 0x20a0, 0x20b5,\r
+ 0xfdfc, 0xfdfc,\r
+ 0xfe69, 0xfe69,\r
+ 0xff04, 0xff04,\r
+ 0xffe0, 0xffe1,\r
+ 0xffe5, 0xffe6\r
+}; /* CR_Sc */\r
+\r
+/* 'Sk': General Category */\r
+static const OnigCodePoint CR_Sk[] = {\r
+ 23,\r
+ 0x005e, 0x005e,\r
+ 0x0060, 0x0060,\r
+ 0x00a8, 0x00a8,\r
+ 0x00af, 0x00af,\r
+ 0x00b4, 0x00b4,\r
+ 0x00b8, 0x00b8,\r
+ 0x02c2, 0x02c5,\r
+ 0x02d2, 0x02df,\r
+ 0x02e5, 0x02ed,\r
+ 0x02ef, 0x02ff,\r
+ 0x0374, 0x0375,\r
+ 0x0384, 0x0385,\r
+ 0x1fbd, 0x1fbd,\r
+ 0x1fbf, 0x1fc1,\r
+ 0x1fcd, 0x1fcf,\r
+ 0x1fdd, 0x1fdf,\r
+ 0x1fed, 0x1fef,\r
+ 0x1ffd, 0x1ffe,\r
+ 0x309b, 0x309c,\r
+ 0xa700, 0xa716,\r
+ 0xff3e, 0xff3e,\r
+ 0xff40, 0xff40,\r
+ 0xffe3, 0xffe3\r
+}; /* CR_Sk */\r
+\r
+/* 'Sm': General Category */\r
+static const OnigCodePoint CR_Sm[] = {\r
+ 59,\r
+ 0x002b, 0x002b,\r
+ 0x003c, 0x003e,\r
+ 0x007c, 0x007c,\r
+ 0x007e, 0x007e,\r
+ 0x00ac, 0x00ac,\r
+ 0x00b1, 0x00b1,\r
+ 0x00d7, 0x00d7,\r
+ 0x00f7, 0x00f7,\r
+ 0x03f6, 0x03f6,\r
+ 0x2044, 0x2044,\r
+ 0x2052, 0x2052,\r
+ 0x207a, 0x207c,\r
+ 0x208a, 0x208c,\r
+ 0x2140, 0x2144,\r
+ 0x214b, 0x214b,\r
+ 0x2190, 0x2194,\r
+ 0x219a, 0x219b,\r
+ 0x21a0, 0x21a0,\r
+ 0x21a3, 0x21a3,\r
+ 0x21a6, 0x21a6,\r
+ 0x21ae, 0x21ae,\r
+ 0x21ce, 0x21cf,\r
+ 0x21d2, 0x21d2,\r
+ 0x21d4, 0x21d4,\r
+ 0x21f4, 0x22ff,\r
+ 0x2308, 0x230b,\r
+ 0x2320, 0x2321,\r
+ 0x237c, 0x237c,\r
+ 0x239b, 0x23b3,\r
+ 0x25b7, 0x25b7,\r
+ 0x25c1, 0x25c1,\r
+ 0x25f8, 0x25ff,\r
+ 0x266f, 0x266f,\r
+ 0x27c0, 0x27c4,\r
+ 0x27d0, 0x27e5,\r
+ 0x27f0, 0x27ff,\r
+ 0x2900, 0x2982,\r
+ 0x2999, 0x29d7,\r
+ 0x29dc, 0x29fb,\r
+ 0x29fe, 0x2aff,\r
+ 0xfb29, 0xfb29,\r
+ 0xfe62, 0xfe62,\r
+ 0xfe64, 0xfe66,\r
+ 0xff0b, 0xff0b,\r
+ 0xff1c, 0xff1e,\r
+ 0xff5c, 0xff5c,\r
+ 0xff5e, 0xff5e,\r
+ 0xffe2, 0xffe2,\r
+ 0xffe9, 0xffec,\r
+ 0x1d6c1, 0x1d6c1,\r
+ 0x1d6db, 0x1d6db,\r
+ 0x1d6fb, 0x1d6fb,\r
+ 0x1d715, 0x1d715,\r
+ 0x1d735, 0x1d735,\r
+ 0x1d74f, 0x1d74f,\r
+ 0x1d76f, 0x1d76f,\r
+ 0x1d789, 0x1d789,\r
+ 0x1d7a9, 0x1d7a9,\r
+ 0x1d7c3, 0x1d7c3\r
+}; /* CR_Sm */\r
+\r
+/* 'So': General Category */\r
+static const OnigCodePoint CR_So[] = {\r
+ 120,\r
+ 0x00a6, 0x00a7,\r
+ 0x00a9, 0x00a9,\r
+ 0x00ae, 0x00ae,\r
+ 0x00b0, 0x00b0,\r
+ 0x00b6, 0x00b6,\r
+ 0x0482, 0x0482,\r
+ 0x060e, 0x060f,\r
+ 0x06e9, 0x06e9,\r
+ 0x06fd, 0x06fe,\r
+ 0x09fa, 0x09fa,\r
+ 0x0b70, 0x0b70,\r
+ 0x0bf3, 0x0bf8,\r
+ 0x0bfa, 0x0bfa,\r
+ 0x0f01, 0x0f03,\r
+ 0x0f13, 0x0f17,\r
+ 0x0f1a, 0x0f1f,\r
+ 0x0f34, 0x0f34,\r
+ 0x0f36, 0x0f36,\r
+ 0x0f38, 0x0f38,\r
+ 0x0fbe, 0x0fc5,\r
+ 0x0fc7, 0x0fcc,\r
+ 0x0fcf, 0x0fcf,\r
+ 0x1360, 0x1360,\r
+ 0x1390, 0x1399,\r
+ 0x1940, 0x1940,\r
+ 0x19e0, 0x19ff,\r
+ 0x2100, 0x2101,\r
+ 0x2103, 0x2106,\r
+ 0x2108, 0x2109,\r
+ 0x2114, 0x2114,\r
+ 0x2116, 0x2118,\r
+ 0x211e, 0x2123,\r
+ 0x2125, 0x2125,\r
+ 0x2127, 0x2127,\r
+ 0x2129, 0x2129,\r
+ 0x212e, 0x212e,\r
+ 0x2132, 0x2132,\r
+ 0x213a, 0x213b,\r
+ 0x214a, 0x214a,\r
+ 0x214c, 0x214c,\r
+ 0x2195, 0x2199,\r
+ 0x219c, 0x219f,\r
+ 0x21a1, 0x21a2,\r
+ 0x21a4, 0x21a5,\r
+ 0x21a7, 0x21ad,\r
+ 0x21af, 0x21cd,\r
+ 0x21d0, 0x21d1,\r
+ 0x21d3, 0x21d3,\r
+ 0x21d5, 0x21f3,\r
+ 0x2300, 0x2307,\r
+ 0x230c, 0x231f,\r
+ 0x2322, 0x2328,\r
+ 0x232b, 0x237b,\r
+ 0x237d, 0x239a,\r
+ 0x23b7, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x249c, 0x24e9,\r
+ 0x2500, 0x25b6,\r
+ 0x25b8, 0x25c0,\r
+ 0x25c2, 0x25f7,\r
+ 0x2600, 0x266e,\r
+ 0x2670, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2767,\r
+ 0x2794, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x2800, 0x28ff,\r
+ 0x2b00, 0x2b13,\r
+ 0x2ce5, 0x2cea,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3004, 0x3004,\r
+ 0x3012, 0x3013,\r
+ 0x3020, 0x3020,\r
+ 0x3036, 0x3037,\r
+ 0x303e, 0x303f,\r
+ 0x3190, 0x3191,\r
+ 0x3196, 0x319f,\r
+ 0x31c0, 0x31cf,\r
+ 0x3200, 0x321e,\r
+ 0x322a, 0x3243,\r
+ 0x3250, 0x3250,\r
+ 0x3260, 0x327f,\r
+ 0x328a, 0x32b0,\r
+ 0x32c0, 0x32fe,\r
+ 0x3300, 0x33ff,\r
+ 0x4dc0, 0x4dff,\r
+ 0xa490, 0xa4c6,\r
+ 0xa828, 0xa82b,\r
+ 0xfdfd, 0xfdfd,\r
+ 0xffe4, 0xffe4,\r
+ 0xffe8, 0xffe8,\r
+ 0xffed, 0xffee,\r
+ 0xfffc, 0xfffd,\r
+ 0x10102, 0x10102,\r
+ 0x10137, 0x1013f,\r
+ 0x10179, 0x10189,\r
+ 0x103d0, 0x103d0,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d164,\r
+ 0x1d16a, 0x1d16c,\r
+ 0x1d183, 0x1d184,\r
+ 0x1d18c, 0x1d1a9,\r
+ 0x1d1ae, 0x1d1dd,\r
+ 0x1d200, 0x1d241,\r
+ 0x1d245, 0x1d245,\r
+ 0x1d300, 0x1d356\r
+}; /* CR_So */\r
+\r
+/* 'Z': Major Category */\r
+static const OnigCodePoint CR_Z[] = {\r
+ 9,\r
+ 0x0020, 0x0020,\r
+ 0x00a0, 0x00a0,\r
+ 0x1680, 0x1680,\r
+ 0x180e, 0x180e,\r
+ 0x2000, 0x200a,\r
+ 0x2028, 0x2029,\r
+ 0x202f, 0x202f,\r
+ 0x205f, 0x205f,\r
+ 0x3000, 0x3000\r
+}; /* CR_Z */\r
+\r
+/* 'Zl': General Category */\r
+static const OnigCodePoint CR_Zl[] = {\r
+ 1,\r
+ 0x2028, 0x2028\r
+}; /* CR_Zl */\r
+\r
+/* 'Zp': General Category */\r
+static const OnigCodePoint CR_Zp[] = {\r
+ 1,\r
+ 0x2029, 0x2029\r
+}; /* CR_Zp */\r
+\r
+/* 'Zs': General Category */\r
+static const OnigCodePoint CR_Zs[] = {\r
+ 8,\r
+ 0x0020, 0x0020,\r
+ 0x00a0, 0x00a0,\r
+ 0x1680, 0x1680,\r
+ 0x180e, 0x180e,\r
+ 0x2000, 0x200a,\r
+ 0x202f, 0x202f,\r
+ 0x205f, 0x205f,\r
+ 0x3000, 0x3000\r
+}; /* CR_Zs */\r
+\r
+/* 'Arabic': Script */\r
+static const OnigCodePoint CR_Arabic[] = {\r
+ 17,\r
+ 0x060b, 0x060b,\r
+ 0x060d, 0x0615,\r
+ 0x061e, 0x061e,\r
+ 0x0621, 0x063a,\r
+ 0x0641, 0x064a,\r
+ 0x0656, 0x065e,\r
+ 0x066a, 0x066f,\r
+ 0x0671, 0x06dc,\r
+ 0x06de, 0x06ff,\r
+ 0x0750, 0x076d,\r
+ 0xfb50, 0xfbb1,\r
+ 0xfbd3, 0xfd3d,\r
+ 0xfd50, 0xfd8f,\r
+ 0xfd92, 0xfdc7,\r
+ 0xfdf0, 0xfdfc,\r
+ 0xfe70, 0xfe74,\r
+ 0xfe76, 0xfefc\r
+}; /* CR_Arabic */\r
+\r
+/* 'Armenian': Script */\r
+static const OnigCodePoint CR_Armenian[] = {\r
+ 5,\r
+ 0x0531, 0x0556,\r
+ 0x0559, 0x055f,\r
+ 0x0561, 0x0587,\r
+ 0x058a, 0x058a,\r
+ 0xfb13, 0xfb17\r
+}; /* CR_Armenian */\r
+\r
+/* 'Bengali': Script */\r
+static const OnigCodePoint CR_Bengali[] = {\r
+ 14,\r
+ 0x0981, 0x0983,\r
+ 0x0985, 0x098c,\r
+ 0x098f, 0x0990,\r
+ 0x0993, 0x09a8,\r
+ 0x09aa, 0x09b0,\r
+ 0x09b2, 0x09b2,\r
+ 0x09b6, 0x09b9,\r
+ 0x09bc, 0x09c4,\r
+ 0x09c7, 0x09c8,\r
+ 0x09cb, 0x09ce,\r
+ 0x09d7, 0x09d7,\r
+ 0x09dc, 0x09dd,\r
+ 0x09df, 0x09e3,\r
+ 0x09e6, 0x09fa\r
+}; /* CR_Bengali */\r
+\r
+/* 'Bopomofo': Script */\r
+static const OnigCodePoint CR_Bopomofo[] = {\r
+ 2,\r
+ 0x3105, 0x312c,\r
+ 0x31a0, 0x31b7\r
+}; /* CR_Bopomofo */\r
+\r
+/* 'Braille': Script */\r
+static const OnigCodePoint CR_Braille[] = {\r
+ 1,\r
+ 0x2800, 0x28ff\r
+}; /* CR_Braille */\r
+\r
+/* 'Buginese': Script */\r
+static const OnigCodePoint CR_Buginese[] = {\r
+ 2,\r
+ 0x1a00, 0x1a1b,\r
+ 0x1a1e, 0x1a1f\r
+}; /* CR_Buginese */\r
+\r
+/* 'Buhid': Script */\r
+static const OnigCodePoint CR_Buhid[] = {\r
+ 1,\r
+ 0x1740, 0x1753\r
+}; /* CR_Buhid */\r
+\r
+/* 'Canadian_Aboriginal': Script */\r
+static const OnigCodePoint CR_Canadian_Aboriginal[] = {\r
+ 1,\r
+ 0x1401, 0x1676\r
+}; /* CR_Canadian_Aboriginal */\r
+\r
+/* 'Cherokee': Script */\r
+static const OnigCodePoint CR_Cherokee[] = {\r
+ 1,\r
+ 0x13a0, 0x13f4\r
+}; /* CR_Cherokee */\r
+\r
+/* 'Common': Script */\r
+static const OnigCodePoint CR_Common[] = {\r
+ 126,\r
+ 0x0000, 0x0040,\r
+ 0x005b, 0x0060,\r
+ 0x007b, 0x00a9,\r
+ 0x00ab, 0x00b9,\r
+ 0x00bb, 0x00bf,\r
+ 0x00d7, 0x00d7,\r
+ 0x00f7, 0x00f7,\r
+ 0x02b9, 0x02df,\r
+ 0x02e5, 0x02ff,\r
+ 0x037e, 0x037e,\r
+ 0x0387, 0x0387,\r
+ 0x0589, 0x0589,\r
+ 0x0600, 0x0603,\r
+ 0x060c, 0x060c,\r
+ 0x061b, 0x061b,\r
+ 0x061f, 0x061f,\r
+ 0x0640, 0x0640,\r
+ 0x0660, 0x0669,\r
+ 0x06dd, 0x06dd,\r
+ 0x0964, 0x0965,\r
+ 0x0970, 0x0970,\r
+ 0x0e3f, 0x0e3f,\r
+ 0x10fb, 0x10fb,\r
+ 0x16eb, 0x16ed,\r
+ 0x1735, 0x1736,\r
+ 0x2000, 0x200b,\r
+ 0x200e, 0x2063,\r
+ 0x206a, 0x2070,\r
+ 0x2074, 0x207e,\r
+ 0x2080, 0x208e,\r
+ 0x20a0, 0x20b5,\r
+ 0x2100, 0x2125,\r
+ 0x2127, 0x2129,\r
+ 0x212c, 0x214c,\r
+ 0x2153, 0x2183,\r
+ 0x2190, 0x23db,\r
+ 0x2400, 0x2426,\r
+ 0x2440, 0x244a,\r
+ 0x2460, 0x269c,\r
+ 0x26a0, 0x26b1,\r
+ 0x2701, 0x2704,\r
+ 0x2706, 0x2709,\r
+ 0x270c, 0x2727,\r
+ 0x2729, 0x274b,\r
+ 0x274d, 0x274d,\r
+ 0x274f, 0x2752,\r
+ 0x2756, 0x2756,\r
+ 0x2758, 0x275e,\r
+ 0x2761, 0x2794,\r
+ 0x2798, 0x27af,\r
+ 0x27b1, 0x27be,\r
+ 0x27c0, 0x27c6,\r
+ 0x27d0, 0x27eb,\r
+ 0x27f0, 0x27ff,\r
+ 0x2900, 0x2b13,\r
+ 0x2e00, 0x2e17,\r
+ 0x2e1c, 0x2e1d,\r
+ 0x2ff0, 0x2ffb,\r
+ 0x3000, 0x3004,\r
+ 0x3006, 0x3006,\r
+ 0x3008, 0x3020,\r
+ 0x3030, 0x3037,\r
+ 0x303c, 0x303f,\r
+ 0x309b, 0x309c,\r
+ 0x30a0, 0x30a0,\r
+ 0x30fb, 0x30fc,\r
+ 0x3190, 0x319f,\r
+ 0x31c0, 0x31cf,\r
+ 0x3220, 0x3243,\r
+ 0x3250, 0x325f,\r
+ 0x327e, 0x32fe,\r
+ 0x3300, 0x33ff,\r
+ 0x4dc0, 0x4dff,\r
+ 0xa700, 0xa716,\r
+ 0xe000, 0xf8ff,\r
+ 0xfd3e, 0xfd3f,\r
+ 0xfdfd, 0xfdfd,\r
+ 0xfe10, 0xfe19,\r
+ 0xfe30, 0xfe52,\r
+ 0xfe54, 0xfe66,\r
+ 0xfe68, 0xfe6b,\r
+ 0xfeff, 0xfeff,\r
+ 0xff01, 0xff20,\r
+ 0xff3b, 0xff40,\r
+ 0xff5b, 0xff65,\r
+ 0xff70, 0xff70,\r
+ 0xff9e, 0xff9f,\r
+ 0xffe0, 0xffe6,\r
+ 0xffe8, 0xffee,\r
+ 0xfff9, 0xfffd,\r
+ 0x10100, 0x10102,\r
+ 0x10107, 0x10133,\r
+ 0x10137, 0x1013f,\r
+ 0x1d000, 0x1d0f5,\r
+ 0x1d100, 0x1d126,\r
+ 0x1d12a, 0x1d166,\r
+ 0x1d16a, 0x1d17a,\r
+ 0x1d183, 0x1d184,\r
+ 0x1d18c, 0x1d1a9,\r
+ 0x1d1ae, 0x1d1dd,\r
+ 0x1d300, 0x1d356,\r
+ 0x1d400, 0x1d454,\r
+ 0x1d456, 0x1d49c,\r
+ 0x1d49e, 0x1d49f,\r
+ 0x1d4a2, 0x1d4a2,\r
+ 0x1d4a5, 0x1d4a6,\r
+ 0x1d4a9, 0x1d4ac,\r
+ 0x1d4ae, 0x1d4b9,\r
+ 0x1d4bb, 0x1d4bb,\r
+ 0x1d4bd, 0x1d4c3,\r
+ 0x1d4c5, 0x1d505,\r
+ 0x1d507, 0x1d50a,\r
+ 0x1d50d, 0x1d514,\r
+ 0x1d516, 0x1d51c,\r
+ 0x1d51e, 0x1d539,\r
+ 0x1d53b, 0x1d53e,\r
+ 0x1d540, 0x1d544,\r
+ 0x1d546, 0x1d546,\r
+ 0x1d54a, 0x1d550,\r
+ 0x1d552, 0x1d6a5,\r
+ 0x1d6a8, 0x1d7c9,\r
+ 0x1d7ce, 0x1d7ff,\r
+ 0xe0001, 0xe0001,\r
+ 0xe0020, 0xe007f,\r
+ 0xf0000, 0xffffd,\r
+ 0x100000, 0x10fffd\r
+}; /* CR_Common */\r
+\r
+/* 'Coptic': Script */\r
+static const OnigCodePoint CR_Coptic[] = {\r
+ 3,\r
+ 0x03e2, 0x03ef,\r
+ 0x2c80, 0x2cea,\r
+ 0x2cf9, 0x2cff\r
+}; /* CR_Coptic */\r
+\r
+/* 'Cypriot': Script */\r
+static const OnigCodePoint CR_Cypriot[] = {\r
+ 6,\r
+ 0x10800, 0x10805,\r
+ 0x10808, 0x10808,\r
+ 0x1080a, 0x10835,\r
+ 0x10837, 0x10838,\r
+ 0x1083c, 0x1083c,\r
+ 0x1083f, 0x1083f\r
+}; /* CR_Cypriot */\r
+\r
+/* 'Cyrillic': Script */\r
+static const OnigCodePoint CR_Cyrillic[] = {\r
+ 6,\r
+ 0x0400, 0x0486,\r
+ 0x0488, 0x04ce,\r
+ 0x04d0, 0x04f9,\r
+ 0x0500, 0x050f,\r
+ 0x1d2b, 0x1d2b,\r
+ 0x1d78, 0x1d78\r
+}; /* CR_Cyrillic */\r
+\r
+/* 'Deseret': Script */\r
+static const OnigCodePoint CR_Deseret[] = {\r
+ 1,\r
+ 0x10400, 0x1044f\r
+}; /* CR_Deseret */\r
+\r
+/* 'Devanagari': Script */\r
+static const OnigCodePoint CR_Devanagari[] = {\r
+ 6,\r
+ 0x0901, 0x0939,\r
+ 0x093c, 0x094d,\r
+ 0x0950, 0x0954,\r
+ 0x0958, 0x0963,\r
+ 0x0966, 0x096f,\r
+ 0x097d, 0x097d\r
+}; /* CR_Devanagari */\r
+\r
+/* 'Ethiopic': Script */\r
+static const OnigCodePoint CR_Ethiopic[] = {\r
+ 27,\r
+ 0x1200, 0x1248,\r
+ 0x124a, 0x124d,\r
+ 0x1250, 0x1256,\r
+ 0x1258, 0x1258,\r
+ 0x125a, 0x125d,\r
+ 0x1260, 0x1288,\r
+ 0x128a, 0x128d,\r
+ 0x1290, 0x12b0,\r
+ 0x12b2, 0x12b5,\r
+ 0x12b8, 0x12be,\r
+ 0x12c0, 0x12c0,\r
+ 0x12c2, 0x12c5,\r
+ 0x12c8, 0x12d6,\r
+ 0x12d8, 0x1310,\r
+ 0x1312, 0x1315,\r
+ 0x1318, 0x135a,\r
+ 0x135f, 0x137c,\r
+ 0x1380, 0x1399,\r
+ 0x2d80, 0x2d96,\r
+ 0x2da0, 0x2da6,\r
+ 0x2da8, 0x2dae,\r
+ 0x2db0, 0x2db6,\r
+ 0x2db8, 0x2dbe,\r
+ 0x2dc0, 0x2dc6,\r
+ 0x2dc8, 0x2dce,\r
+ 0x2dd0, 0x2dd6,\r
+ 0x2dd8, 0x2dde\r
+}; /* CR_Ethiopic */\r
+\r
+/* 'Georgian': Script */\r
+static const OnigCodePoint CR_Georgian[] = {\r
+ 4,\r
+ 0x10a0, 0x10c5,\r
+ 0x10d0, 0x10fa,\r
+ 0x10fc, 0x10fc,\r
+ 0x2d00, 0x2d25\r
+}; /* CR_Georgian */\r
+\r
+/* 'Glagolitic': Script */\r
+static const OnigCodePoint CR_Glagolitic[] = {\r
+ 2,\r
+ 0x2c00, 0x2c2e,\r
+ 0x2c30, 0x2c5e\r
+}; /* CR_Glagolitic */\r
+\r
+/* 'Gothic': Script */\r
+static const OnigCodePoint CR_Gothic[] = {\r
+ 1,\r
+ 0x10330, 0x1034a\r
+}; /* CR_Gothic */\r
+\r
+/* 'Greek': Script */\r
+static const OnigCodePoint CR_Greek[] = {\r
+ 31,\r
+ 0x0374, 0x0375,\r
+ 0x037a, 0x037a,\r
+ 0x0384, 0x0386,\r
+ 0x0388, 0x038a,\r
+ 0x038c, 0x038c,\r
+ 0x038e, 0x03a1,\r
+ 0x03a3, 0x03ce,\r
+ 0x03d0, 0x03e1,\r
+ 0x03f0, 0x03ff,\r
+ 0x1d26, 0x1d2a,\r
+ 0x1d5d, 0x1d61,\r
+ 0x1d66, 0x1d6a,\r
+ 0x1f00, 0x1f15,\r
+ 0x1f18, 0x1f1d,\r
+ 0x1f20, 0x1f45,\r
+ 0x1f48, 0x1f4d,\r
+ 0x1f50, 0x1f57,\r
+ 0x1f59, 0x1f59,\r
+ 0x1f5b, 0x1f5b,\r
+ 0x1f5d, 0x1f5d,\r
+ 0x1f5f, 0x1f7d,\r
+ 0x1f80, 0x1fb4,\r
+ 0x1fb6, 0x1fc4,\r
+ 0x1fc6, 0x1fd3,\r
+ 0x1fd6, 0x1fdb,\r
+ 0x1fdd, 0x1fef,\r
+ 0x1ff2, 0x1ff4,\r
+ 0x1ff6, 0x1ffe,\r
+ 0x2126, 0x2126,\r
+ 0x10140, 0x1018a,\r
+ 0x1d200, 0x1d245\r
+}; /* CR_Greek */\r
+\r
+/* 'Gujarati': Script */\r
+static const OnigCodePoint CR_Gujarati[] = {\r
+ 14,\r
+ 0x0a81, 0x0a83,\r
+ 0x0a85, 0x0a8d,\r
+ 0x0a8f, 0x0a91,\r
+ 0x0a93, 0x0aa8,\r
+ 0x0aaa, 0x0ab0,\r
+ 0x0ab2, 0x0ab3,\r
+ 0x0ab5, 0x0ab9,\r
+ 0x0abc, 0x0ac5,\r
+ 0x0ac7, 0x0ac9,\r
+ 0x0acb, 0x0acd,\r
+ 0x0ad0, 0x0ad0,\r
+ 0x0ae0, 0x0ae3,\r
+ 0x0ae6, 0x0aef,\r
+ 0x0af1, 0x0af1\r
+}; /* CR_Gujarati */\r
+\r
+/* 'Gurmukhi': Script */\r
+static const OnigCodePoint CR_Gurmukhi[] = {\r
+ 15,\r
+ 0x0a01, 0x0a03,\r
+ 0x0a05, 0x0a0a,\r
+ 0x0a0f, 0x0a10,\r
+ 0x0a13, 0x0a28,\r
+ 0x0a2a, 0x0a30,\r
+ 0x0a32, 0x0a33,\r
+ 0x0a35, 0x0a36,\r
+ 0x0a38, 0x0a39,\r
+ 0x0a3c, 0x0a3c,\r
+ 0x0a3e, 0x0a42,\r
+ 0x0a47, 0x0a48,\r
+ 0x0a4b, 0x0a4d,\r
+ 0x0a59, 0x0a5c,\r
+ 0x0a5e, 0x0a5e,\r
+ 0x0a66, 0x0a74\r
+}; /* CR_Gurmukhi */\r
+\r
+/* 'Han': Script */\r
+static const OnigCodePoint CR_Han[] = {\r
+ 14,\r
+ 0x2e80, 0x2e99,\r
+ 0x2e9b, 0x2ef3,\r
+ 0x2f00, 0x2fd5,\r
+ 0x3005, 0x3005,\r
+ 0x3007, 0x3007,\r
+ 0x3021, 0x3029,\r
+ 0x3038, 0x303b,\r
+ 0x3400, 0x4db5,\r
+ 0x4e00, 0x9fbb,\r
+ 0xf900, 0xfa2d,\r
+ 0xfa30, 0xfa6a,\r
+ 0xfa70, 0xfad9,\r
+ 0x20000, 0x2a6d6,\r
+ 0x2f800, 0x2fa1d\r
+}; /* CR_Han */\r
+\r
+/* 'Hangul': Script */\r
+static const OnigCodePoint CR_Hangul[] = {\r
+ 12,\r
+ 0x1100, 0x1159,\r
+ 0x115f, 0x11a2,\r
+ 0x11a8, 0x11f9,\r
+ 0x3131, 0x318e,\r
+ 0x3200, 0x321e,\r
+ 0x3260, 0x327d,\r
+ 0xac00, 0xd7a3,\r
+ 0xffa0, 0xffbe,\r
+ 0xffc2, 0xffc7,\r
+ 0xffca, 0xffcf,\r
+ 0xffd2, 0xffd7,\r
+ 0xffda, 0xffdc\r
+}; /* CR_Hangul */\r
+\r
+/* 'Hanunoo': Script */\r
+static const OnigCodePoint CR_Hanunoo[] = {\r
+ 1,\r
+ 0x1720, 0x1734\r
+}; /* CR_Hanunoo */\r
+\r
+/* 'Hebrew': Script */\r
+static const OnigCodePoint CR_Hebrew[] = {\r
+ 10,\r
+ 0x0591, 0x05b9,\r
+ 0x05bb, 0x05c7,\r
+ 0x05d0, 0x05ea,\r
+ 0x05f0, 0x05f4,\r
+ 0xfb1d, 0xfb36,\r
+ 0xfb38, 0xfb3c,\r
+ 0xfb3e, 0xfb3e,\r
+ 0xfb40, 0xfb41,\r
+ 0xfb43, 0xfb44,\r
+ 0xfb46, 0xfb4f\r
+}; /* CR_Hebrew */\r
+\r
+/* 'Hiragana': Script */\r
+static const OnigCodePoint CR_Hiragana[] = {\r
+ 2,\r
+ 0x3041, 0x3096,\r
+ 0x309d, 0x309f\r
+}; /* CR_Hiragana */\r
+\r
+/* 'Inherited': Script */\r
+static const OnigCodePoint CR_Inherited[] = {\r
+ 15,\r
+ 0x0300, 0x036f,\r
+ 0x064b, 0x0655,\r
+ 0x0670, 0x0670,\r
+ 0x1dc0, 0x1dc3,\r
+ 0x200c, 0x200d,\r
+ 0x20d0, 0x20eb,\r
+ 0x302a, 0x302f,\r
+ 0x3099, 0x309a,\r
+ 0xfe00, 0xfe0f,\r
+ 0xfe20, 0xfe23,\r
+ 0x1d167, 0x1d169,\r
+ 0x1d17b, 0x1d182,\r
+ 0x1d185, 0x1d18b,\r
+ 0x1d1aa, 0x1d1ad,\r
+ 0xe0100, 0xe01ef\r
+}; /* CR_Inherited */\r
+\r
+/* 'Kannada': Script */\r
+static const OnigCodePoint CR_Kannada[] = {\r
+ 13,\r
+ 0x0c82, 0x0c83,\r
+ 0x0c85, 0x0c8c,\r
+ 0x0c8e, 0x0c90,\r
+ 0x0c92, 0x0ca8,\r
+ 0x0caa, 0x0cb3,\r
+ 0x0cb5, 0x0cb9,\r
+ 0x0cbc, 0x0cc4,\r
+ 0x0cc6, 0x0cc8,\r
+ 0x0cca, 0x0ccd,\r
+ 0x0cd5, 0x0cd6,\r
+ 0x0cde, 0x0cde,\r
+ 0x0ce0, 0x0ce1,\r
+ 0x0ce6, 0x0cef\r
+}; /* CR_Kannada */\r
+\r
+/* 'Katakana': Script */\r
+static const OnigCodePoint CR_Katakana[] = {\r
+ 5,\r
+ 0x30a1, 0x30fa,\r
+ 0x30fd, 0x30ff,\r
+ 0x31f0, 0x31ff,\r
+ 0xff66, 0xff6f,\r
+ 0xff71, 0xff9d\r
+}; /* CR_Katakana */\r
+\r
+/* 'Kharoshthi': Script */\r
+static const OnigCodePoint CR_Kharoshthi[] = {\r
+ 8,\r
+ 0x10a00, 0x10a03,\r
+ 0x10a05, 0x10a06,\r
+ 0x10a0c, 0x10a13,\r
+ 0x10a15, 0x10a17,\r
+ 0x10a19, 0x10a33,\r
+ 0x10a38, 0x10a3a,\r
+ 0x10a3f, 0x10a47,\r
+ 0x10a50, 0x10a58\r
+}; /* CR_Kharoshthi */\r
+\r
+/* 'Khmer': Script */\r
+static const OnigCodePoint CR_Khmer[] = {\r
+ 4,\r
+ 0x1780, 0x17dd,\r
+ 0x17e0, 0x17e9,\r
+ 0x17f0, 0x17f9,\r
+ 0x19e0, 0x19ff\r
+}; /* CR_Khmer */\r
+\r
+/* 'Lao': Script */\r
+static const OnigCodePoint CR_Lao[] = {\r
+ 18,\r
+ 0x0e81, 0x0e82,\r
+ 0x0e84, 0x0e84,\r
+ 0x0e87, 0x0e88,\r
+ 0x0e8a, 0x0e8a,\r
+ 0x0e8d, 0x0e8d,\r
+ 0x0e94, 0x0e97,\r
+ 0x0e99, 0x0e9f,\r
+ 0x0ea1, 0x0ea3,\r
+ 0x0ea5, 0x0ea5,\r
+ 0x0ea7, 0x0ea7,\r
+ 0x0eaa, 0x0eab,\r
+ 0x0ead, 0x0eb9,\r
+ 0x0ebb, 0x0ebd,\r
+ 0x0ec0, 0x0ec4,\r
+ 0x0ec6, 0x0ec6,\r
+ 0x0ec8, 0x0ecd,\r
+ 0x0ed0, 0x0ed9,\r
+ 0x0edc, 0x0edd\r
+}; /* CR_Lao */\r
+\r
+/* 'Latin': Script */\r
+static const OnigCodePoint CR_Latin[] = {\r
+ 23,\r
+ 0x0041, 0x005a,\r
+ 0x0061, 0x007a,\r
+ 0x00aa, 0x00aa,\r
+ 0x00ba, 0x00ba,\r
+ 0x00c0, 0x00d6,\r
+ 0x00d8, 0x00f6,\r
+ 0x00f8, 0x0241,\r
+ 0x0250, 0x02b8,\r
+ 0x02e0, 0x02e4,\r
+ 0x1d00, 0x1d25,\r
+ 0x1d2c, 0x1d5c,\r
+ 0x1d62, 0x1d65,\r
+ 0x1d6b, 0x1d77,\r
+ 0x1d79, 0x1dbf,\r
+ 0x1e00, 0x1e9b,\r
+ 0x1ea0, 0x1ef9,\r
+ 0x2071, 0x2071,\r
+ 0x207f, 0x207f,\r
+ 0x2090, 0x2094,\r
+ 0x212a, 0x212b,\r
+ 0xfb00, 0xfb06,\r
+ 0xff21, 0xff3a,\r
+ 0xff41, 0xff5a\r
+}; /* CR_Latin */\r
+\r
+/* 'Limbu': Script */\r
+static const OnigCodePoint CR_Limbu[] = {\r
+ 5,\r
+ 0x1900, 0x191c,\r
+ 0x1920, 0x192b,\r
+ 0x1930, 0x193b,\r
+ 0x1940, 0x1940,\r
+ 0x1944, 0x194f\r
+}; /* CR_Limbu */\r
+\r
+/* 'Linear_B': Script */\r
+static const OnigCodePoint CR_Linear_B[] = {\r
+ 7,\r
+ 0x10000, 0x1000b,\r
+ 0x1000d, 0x10026,\r
+ 0x10028, 0x1003a,\r
+ 0x1003c, 0x1003d,\r
+ 0x1003f, 0x1004d,\r
+ 0x10050, 0x1005d,\r
+ 0x10080, 0x100fa\r
+}; /* CR_Linear_B */\r
+\r
+/* 'Malayalam': Script */\r
+static const OnigCodePoint CR_Malayalam[] = {\r
+ 11,\r
+ 0x0d02, 0x0d03,\r
+ 0x0d05, 0x0d0c,\r
+ 0x0d0e, 0x0d10,\r
+ 0x0d12, 0x0d28,\r
+ 0x0d2a, 0x0d39,\r
+ 0x0d3e, 0x0d43,\r
+ 0x0d46, 0x0d48,\r
+ 0x0d4a, 0x0d4d,\r
+ 0x0d57, 0x0d57,\r
+ 0x0d60, 0x0d61,\r
+ 0x0d66, 0x0d6f\r
+}; /* CR_Malayalam */\r
+\r
+/* 'Mongolian': Script */\r
+static const OnigCodePoint CR_Mongolian[] = {\r
+ 4,\r
+ 0x1800, 0x180e,\r
+ 0x1810, 0x1819,\r
+ 0x1820, 0x1877,\r
+ 0x1880, 0x18a9\r
+}; /* CR_Mongolian */\r
+\r
+/* 'Myanmar': Script */\r
+static const OnigCodePoint CR_Myanmar[] = {\r
+ 6,\r
+ 0x1000, 0x1021,\r
+ 0x1023, 0x1027,\r
+ 0x1029, 0x102a,\r
+ 0x102c, 0x1032,\r
+ 0x1036, 0x1039,\r
+ 0x1040, 0x1059\r
+}; /* CR_Myanmar */\r
+\r
+/* 'New_Tai_Lue': Script */\r
+static const OnigCodePoint CR_New_Tai_Lue[] = {\r
+ 4,\r
+ 0x1980, 0x19a9,\r
+ 0x19b0, 0x19c9,\r
+ 0x19d0, 0x19d9,\r
+ 0x19de, 0x19df\r
+}; /* CR_New_Tai_Lue */\r
+\r
+/* 'Ogham': Script */\r
+static const OnigCodePoint CR_Ogham[] = {\r
+ 1,\r
+ 0x1680, 0x169c\r
+}; /* CR_Ogham */\r
+\r
+/* 'Old_Italic': Script */\r
+static const OnigCodePoint CR_Old_Italic[] = {\r
+ 2,\r
+ 0x10300, 0x1031e,\r
+ 0x10320, 0x10323\r
+}; /* CR_Old_Italic */\r
+\r
+/* 'Old_Persian': Script */\r
+static const OnigCodePoint CR_Old_Persian[] = {\r
+ 2,\r
+ 0x103a0, 0x103c3,\r
+ 0x103c8, 0x103d5\r
+}; /* CR_Old_Persian */\r
+\r
+/* 'Oriya': Script */\r
+static const OnigCodePoint CR_Oriya[] = {\r
+ 14,\r
+ 0x0b01, 0x0b03,\r
+ 0x0b05, 0x0b0c,\r
+ 0x0b0f, 0x0b10,\r
+ 0x0b13, 0x0b28,\r
+ 0x0b2a, 0x0b30,\r
+ 0x0b32, 0x0b33,\r
+ 0x0b35, 0x0b39,\r
+ 0x0b3c, 0x0b43,\r
+ 0x0b47, 0x0b48,\r
+ 0x0b4b, 0x0b4d,\r
+ 0x0b56, 0x0b57,\r
+ 0x0b5c, 0x0b5d,\r
+ 0x0b5f, 0x0b61,\r
+ 0x0b66, 0x0b71\r
+}; /* CR_Oriya */\r
+\r
+/* 'Osmanya': Script */\r
+static const OnigCodePoint CR_Osmanya[] = {\r
+ 2,\r
+ 0x10480, 0x1049d,\r
+ 0x104a0, 0x104a9\r
+}; /* CR_Osmanya */\r
+\r
+/* 'Runic': Script */\r
+static const OnigCodePoint CR_Runic[] = {\r
+ 2,\r
+ 0x16a0, 0x16ea,\r
+ 0x16ee, 0x16f0\r
+}; /* CR_Runic */\r
+\r
+/* 'Shavian': Script */\r
+static const OnigCodePoint CR_Shavian[] = {\r
+ 1,\r
+ 0x10450, 0x1047f\r
+}; /* CR_Shavian */\r
+\r
+/* 'Sinhala': Script */\r
+static const OnigCodePoint CR_Sinhala[] = {\r
+ 11,\r
+ 0x0d82, 0x0d83,\r
+ 0x0d85, 0x0d96,\r
+ 0x0d9a, 0x0db1,\r
+ 0x0db3, 0x0dbb,\r
+ 0x0dbd, 0x0dbd,\r
+ 0x0dc0, 0x0dc6,\r
+ 0x0dca, 0x0dca,\r
+ 0x0dcf, 0x0dd4,\r
+ 0x0dd6, 0x0dd6,\r
+ 0x0dd8, 0x0ddf,\r
+ 0x0df2, 0x0df4\r
+}; /* CR_Sinhala */\r
+\r
+/* 'Syloti_Nagri': Script */\r
+static const OnigCodePoint CR_Syloti_Nagri[] = {\r
+ 1,\r
+ 0xa800, 0xa82b\r
+}; /* CR_Syloti_Nagri */\r
+\r
+/* 'Syriac': Script */\r
+static const OnigCodePoint CR_Syriac[] = {\r
+ 3,\r
+ 0x0700, 0x070d,\r
+ 0x070f, 0x074a,\r
+ 0x074d, 0x074f\r
+}; /* CR_Syriac */\r
+\r
+/* 'Tagalog': Script */\r
+static const OnigCodePoint CR_Tagalog[] = {\r
+ 2,\r
+ 0x1700, 0x170c,\r
+ 0x170e, 0x1714\r
+}; /* CR_Tagalog */\r
+\r
+/* 'Tagbanwa': Script */\r
+static const OnigCodePoint CR_Tagbanwa[] = {\r
+ 3,\r
+ 0x1760, 0x176c,\r
+ 0x176e, 0x1770,\r
+ 0x1772, 0x1773\r
+}; /* CR_Tagbanwa */\r
+\r
+/* 'Tai_Le': Script */\r
+static const OnigCodePoint CR_Tai_Le[] = {\r
+ 2,\r
+ 0x1950, 0x196d,\r
+ 0x1970, 0x1974\r
+}; /* CR_Tai_Le */\r
+\r
+/* 'Tamil': Script */\r
+static const OnigCodePoint CR_Tamil[] = {\r
+ 15,\r
+ 0x0b82, 0x0b83,\r
+ 0x0b85, 0x0b8a,\r
+ 0x0b8e, 0x0b90,\r
+ 0x0b92, 0x0b95,\r
+ 0x0b99, 0x0b9a,\r
+ 0x0b9c, 0x0b9c,\r
+ 0x0b9e, 0x0b9f,\r
+ 0x0ba3, 0x0ba4,\r
+ 0x0ba8, 0x0baa,\r
+ 0x0bae, 0x0bb9,\r
+ 0x0bbe, 0x0bc2,\r
+ 0x0bc6, 0x0bc8,\r
+ 0x0bca, 0x0bcd,\r
+ 0x0bd7, 0x0bd7,\r
+ 0x0be6, 0x0bfa\r
+}; /* CR_Tamil */\r
+\r
+/* 'Telugu': Script */\r
+static const OnigCodePoint CR_Telugu[] = {\r
+ 12,\r
+ 0x0c01, 0x0c03,\r
+ 0x0c05, 0x0c0c,\r
+ 0x0c0e, 0x0c10,\r
+ 0x0c12, 0x0c28,\r
+ 0x0c2a, 0x0c33,\r
+ 0x0c35, 0x0c39,\r
+ 0x0c3e, 0x0c44,\r
+ 0x0c46, 0x0c48,\r
+ 0x0c4a, 0x0c4d,\r
+ 0x0c55, 0x0c56,\r
+ 0x0c60, 0x0c61,\r
+ 0x0c66, 0x0c6f\r
+}; /* CR_Telugu */\r
+\r
+/* 'Thaana': Script */\r
+static const OnigCodePoint CR_Thaana[] = {\r
+ 1,\r
+ 0x0780, 0x07b1\r
+}; /* CR_Thaana */\r
+\r
+/* 'Thai': Script */\r
+static const OnigCodePoint CR_Thai[] = {\r
+ 2,\r
+ 0x0e01, 0x0e3a,\r
+ 0x0e40, 0x0e5b\r
+}; /* CR_Thai */\r
+\r
+/* 'Tibetan': Script */\r
+static const OnigCodePoint CR_Tibetan[] = {\r
+ 7,\r
+ 0x0f00, 0x0f47,\r
+ 0x0f49, 0x0f6a,\r
+ 0x0f71, 0x0f8b,\r
+ 0x0f90, 0x0f97,\r
+ 0x0f99, 0x0fbc,\r
+ 0x0fbe, 0x0fcc,\r
+ 0x0fcf, 0x0fd1\r
+}; /* CR_Tibetan */\r
+\r
+/* 'Tifinagh': Script */\r
+static const OnigCodePoint CR_Tifinagh[] = {\r
+ 2,\r
+ 0x2d30, 0x2d65,\r
+ 0x2d6f, 0x2d6f\r
+}; /* CR_Tifinagh */\r
+\r
+/* 'Ugaritic': Script */\r
+static const OnigCodePoint CR_Ugaritic[] = {\r
+ 2,\r
+ 0x10380, 0x1039d,\r
+ 0x1039f, 0x1039f\r
+}; /* CR_Ugaritic */\r
+\r
+/* 'Yi': Script */\r
+static const OnigCodePoint CR_Yi[] = {\r
+ 2,\r
+ 0xa000, 0xa48c,\r
+ 0xa490, 0xa4c6\r
+}; /* CR_Yi */\r
+\r
+\r
+#endif /* USE_UNICODE_PROPERTIES */\r
+\r
+\r
+typedef struct {\r
+ int n;\r
+ OnigCodePoint code[3];\r
+} CodePointList3;\r
+\r
+typedef struct {\r
+ OnigCodePoint from;\r
+ CodePointList3 to;\r
+} CaseFold_11_Type;\r
+\r
+typedef struct {\r
+ OnigCodePoint from;\r
+ CodePointList3 to;\r
+} CaseUnfold_11_Type;\r
+\r
+typedef struct {\r
+ int n;\r
+ OnigCodePoint code[2];\r
+} CodePointList2;\r
+\r
+typedef struct {\r
+ OnigCodePoint from[2];\r
+ CodePointList2 to;\r
+} CaseUnfold_12_Type;\r
+\r
+typedef struct {\r
+ OnigCodePoint from[3];\r
+ CodePointList2 to;\r
+} CaseUnfold_13_Type;\r
+\r
+static const CaseFold_11_Type CaseFold[] = {\r
+ { 0x0041, {1, {0x0061}}},\r
+ { 0x0042, {1, {0x0062}}},\r
+ { 0x0043, {1, {0x0063}}},\r
+ { 0x0044, {1, {0x0064}}},\r
+ { 0x0045, {1, {0x0065}}},\r
+ { 0x0046, {1, {0x0066}}},\r
+ { 0x0047, {1, {0x0067}}},\r
+ { 0x0048, {1, {0x0068}}},\r
+ { 0x004a, {1, {0x006a}}},\r
+ { 0x004b, {1, {0x006b}}},\r
+ { 0x004c, {1, {0x006c}}},\r
+ { 0x004d, {1, {0x006d}}},\r
+ { 0x004e, {1, {0x006e}}},\r
+ { 0x004f, {1, {0x006f}}},\r
+ { 0x0050, {1, {0x0070}}},\r
+ { 0x0051, {1, {0x0071}}},\r
+ { 0x0052, {1, {0x0072}}},\r
+ { 0x0053, {1, {0x0073}}},\r
+ { 0x0054, {1, {0x0074}}},\r
+ { 0x0055, {1, {0x0075}}},\r
+ { 0x0056, {1, {0x0076}}},\r
+ { 0x0057, {1, {0x0077}}},\r
+ { 0x0058, {1, {0x0078}}},\r
+ { 0x0059, {1, {0x0079}}},\r
+ { 0x005a, {1, {0x007a}}},\r
+ { 0x00b5, {1, {0x03bc}}},\r
+ { 0x00c0, {1, {0x00e0}}},\r
+ { 0x00c1, {1, {0x00e1}}},\r
+ { 0x00c2, {1, {0x00e2}}},\r
+ { 0x00c3, {1, {0x00e3}}},\r
+ { 0x00c4, {1, {0x00e4}}},\r
+ { 0x00c5, {1, {0x00e5}}},\r
+ { 0x00c6, {1, {0x00e6}}},\r
+ { 0x00c7, {1, {0x00e7}}},\r
+ { 0x00c8, {1, {0x00e8}}},\r
+ { 0x00c9, {1, {0x00e9}}},\r
+ { 0x00ca, {1, {0x00ea}}},\r
+ { 0x00cb, {1, {0x00eb}}},\r
+ { 0x00cc, {1, {0x00ec}}},\r
+ { 0x00cd, {1, {0x00ed}}},\r
+ { 0x00ce, {1, {0x00ee}}},\r
+ { 0x00cf, {1, {0x00ef}}},\r
+ { 0x00d0, {1, {0x00f0}}},\r
+ { 0x00d1, {1, {0x00f1}}},\r
+ { 0x00d2, {1, {0x00f2}}},\r
+ { 0x00d3, {1, {0x00f3}}},\r
+ { 0x00d4, {1, {0x00f4}}},\r
+ { 0x00d5, {1, {0x00f5}}},\r
+ { 0x00d6, {1, {0x00f6}}},\r
+ { 0x00d8, {1, {0x00f8}}},\r
+ { 0x00d9, {1, {0x00f9}}},\r
+ { 0x00da, {1, {0x00fa}}},\r
+ { 0x00db, {1, {0x00fb}}},\r
+ { 0x00dc, {1, {0x00fc}}},\r
+ { 0x00dd, {1, {0x00fd}}},\r
+ { 0x00de, {1, {0x00fe}}},\r
+ { 0x00df, {2, {0x0073, 0x0073}}},\r
+ { 0x0100, {1, {0x0101}}},\r
+ { 0x0102, {1, {0x0103}}},\r
+ { 0x0104, {1, {0x0105}}},\r
+ { 0x0106, {1, {0x0107}}},\r
+ { 0x0108, {1, {0x0109}}},\r
+ { 0x010a, {1, {0x010b}}},\r
+ { 0x010c, {1, {0x010d}}},\r
+ { 0x010e, {1, {0x010f}}},\r
+ { 0x0110, {1, {0x0111}}},\r
+ { 0x0112, {1, {0x0113}}},\r
+ { 0x0114, {1, {0x0115}}},\r
+ { 0x0116, {1, {0x0117}}},\r
+ { 0x0118, {1, {0x0119}}},\r
+ { 0x011a, {1, {0x011b}}},\r
+ { 0x011c, {1, {0x011d}}},\r
+ { 0x011e, {1, {0x011f}}},\r
+ { 0x0120, {1, {0x0121}}},\r
+ { 0x0122, {1, {0x0123}}},\r
+ { 0x0124, {1, {0x0125}}},\r
+ { 0x0126, {1, {0x0127}}},\r
+ { 0x0128, {1, {0x0129}}},\r
+ { 0x012a, {1, {0x012b}}},\r
+ { 0x012c, {1, {0x012d}}},\r
+ { 0x012e, {1, {0x012f}}},\r
+ { 0x0132, {1, {0x0133}}},\r
+ { 0x0134, {1, {0x0135}}},\r
+ { 0x0136, {1, {0x0137}}},\r
+ { 0x0139, {1, {0x013a}}},\r
+ { 0x013b, {1, {0x013c}}},\r
+ { 0x013d, {1, {0x013e}}},\r
+ { 0x013f, {1, {0x0140}}},\r
+ { 0x0141, {1, {0x0142}}},\r
+ { 0x0143, {1, {0x0144}}},\r
+ { 0x0145, {1, {0x0146}}},\r
+ { 0x0147, {1, {0x0148}}},\r
+ { 0x0149, {2, {0x02bc, 0x006e}}},\r
+ { 0x014a, {1, {0x014b}}},\r
+ { 0x014c, {1, {0x014d}}},\r
+ { 0x014e, {1, {0x014f}}},\r
+ { 0x0150, {1, {0x0151}}},\r
+ { 0x0152, {1, {0x0153}}},\r
+ { 0x0154, {1, {0x0155}}},\r
+ { 0x0156, {1, {0x0157}}},\r
+ { 0x0158, {1, {0x0159}}},\r
+ { 0x015a, {1, {0x015b}}},\r
+ { 0x015c, {1, {0x015d}}},\r
+ { 0x015e, {1, {0x015f}}},\r
+ { 0x0160, {1, {0x0161}}},\r
+ { 0x0162, {1, {0x0163}}},\r
+ { 0x0164, {1, {0x0165}}},\r
+ { 0x0166, {1, {0x0167}}},\r
+ { 0x0168, {1, {0x0169}}},\r
+ { 0x016a, {1, {0x016b}}},\r
+ { 0x016c, {1, {0x016d}}},\r
+ { 0x016e, {1, {0x016f}}},\r
+ { 0x0170, {1, {0x0171}}},\r
+ { 0x0172, {1, {0x0173}}},\r
+ { 0x0174, {1, {0x0175}}},\r
+ { 0x0176, {1, {0x0177}}},\r
+ { 0x0178, {1, {0x00ff}}},\r
+ { 0x0179, {1, {0x017a}}},\r
+ { 0x017b, {1, {0x017c}}},\r
+ { 0x017d, {1, {0x017e}}},\r
+ { 0x017f, {1, {0x0073}}},\r
+ { 0x0181, {1, {0x0253}}},\r
+ { 0x0182, {1, {0x0183}}},\r
+ { 0x0184, {1, {0x0185}}},\r
+ { 0x0186, {1, {0x0254}}},\r
+ { 0x0187, {1, {0x0188}}},\r
+ { 0x0189, {1, {0x0256}}},\r
+ { 0x018a, {1, {0x0257}}},\r
+ { 0x018b, {1, {0x018c}}},\r
+ { 0x018e, {1, {0x01dd}}},\r
+ { 0x018f, {1, {0x0259}}},\r
+ { 0x0190, {1, {0x025b}}},\r
+ { 0x0191, {1, {0x0192}}},\r
+ { 0x0193, {1, {0x0260}}},\r
+ { 0x0194, {1, {0x0263}}},\r
+ { 0x0196, {1, {0x0269}}},\r
+ { 0x0197, {1, {0x0268}}},\r
+ { 0x0198, {1, {0x0199}}},\r
+ { 0x019c, {1, {0x026f}}},\r
+ { 0x019d, {1, {0x0272}}},\r
+ { 0x019f, {1, {0x0275}}},\r
+ { 0x01a0, {1, {0x01a1}}},\r
+ { 0x01a2, {1, {0x01a3}}},\r
+ { 0x01a4, {1, {0x01a5}}},\r
+ { 0x01a6, {1, {0x0280}}},\r
+ { 0x01a7, {1, {0x01a8}}},\r
+ { 0x01a9, {1, {0x0283}}},\r
+ { 0x01ac, {1, {0x01ad}}},\r
+ { 0x01ae, {1, {0x0288}}},\r
+ { 0x01af, {1, {0x01b0}}},\r
+ { 0x01b1, {1, {0x028a}}},\r
+ { 0x01b2, {1, {0x028b}}},\r
+ { 0x01b3, {1, {0x01b4}}},\r
+ { 0x01b5, {1, {0x01b6}}},\r
+ { 0x01b7, {1, {0x0292}}},\r
+ { 0x01b8, {1, {0x01b9}}},\r
+ { 0x01bc, {1, {0x01bd}}},\r
+ { 0x01c4, {1, {0x01c6}}},\r
+ { 0x01c5, {1, {0x01c6}}},\r
+ { 0x01c7, {1, {0x01c9}}},\r
+ { 0x01c8, {1, {0x01c9}}},\r
+ { 0x01ca, {1, {0x01cc}}},\r
+ { 0x01cb, {1, {0x01cc}}},\r
+ { 0x01cd, {1, {0x01ce}}},\r
+ { 0x01cf, {1, {0x01d0}}},\r
+ { 0x01d1, {1, {0x01d2}}},\r
+ { 0x01d3, {1, {0x01d4}}},\r
+ { 0x01d5, {1, {0x01d6}}},\r
+ { 0x01d7, {1, {0x01d8}}},\r
+ { 0x01d9, {1, {0x01da}}},\r
+ { 0x01db, {1, {0x01dc}}},\r
+ { 0x01de, {1, {0x01df}}},\r
+ { 0x01e0, {1, {0x01e1}}},\r
+ { 0x01e2, {1, {0x01e3}}},\r
+ { 0x01e4, {1, {0x01e5}}},\r
+ { 0x01e6, {1, {0x01e7}}},\r
+ { 0x01e8, {1, {0x01e9}}},\r
+ { 0x01ea, {1, {0x01eb}}},\r
+ { 0x01ec, {1, {0x01ed}}},\r
+ { 0x01ee, {1, {0x01ef}}},\r
+ { 0x01f0, {2, {0x006a, 0x030c}}},\r
+ { 0x01f1, {1, {0x01f3}}},\r
+ { 0x01f2, {1, {0x01f3}}},\r
+ { 0x01f4, {1, {0x01f5}}},\r
+ { 0x01f6, {1, {0x0195}}},\r
+ { 0x01f7, {1, {0x01bf}}},\r
+ { 0x01f8, {1, {0x01f9}}},\r
+ { 0x01fa, {1, {0x01fb}}},\r
+ { 0x01fc, {1, {0x01fd}}},\r
+ { 0x01fe, {1, {0x01ff}}},\r
+ { 0x0200, {1, {0x0201}}},\r
+ { 0x0202, {1, {0x0203}}},\r
+ { 0x0204, {1, {0x0205}}},\r
+ { 0x0206, {1, {0x0207}}},\r
+ { 0x0208, {1, {0x0209}}},\r
+ { 0x020a, {1, {0x020b}}},\r
+ { 0x020c, {1, {0x020d}}},\r
+ { 0x020e, {1, {0x020f}}},\r
+ { 0x0210, {1, {0x0211}}},\r
+ { 0x0212, {1, {0x0213}}},\r
+ { 0x0214, {1, {0x0215}}},\r
+ { 0x0216, {1, {0x0217}}},\r
+ { 0x0218, {1, {0x0219}}},\r
+ { 0x021a, {1, {0x021b}}},\r
+ { 0x021c, {1, {0x021d}}},\r
+ { 0x021e, {1, {0x021f}}},\r
+ { 0x0220, {1, {0x019e}}},\r
+ { 0x0222, {1, {0x0223}}},\r
+ { 0x0224, {1, {0x0225}}},\r
+ { 0x0226, {1, {0x0227}}},\r
+ { 0x0228, {1, {0x0229}}},\r
+ { 0x022a, {1, {0x022b}}},\r
+ { 0x022c, {1, {0x022d}}},\r
+ { 0x022e, {1, {0x022f}}},\r
+ { 0x0230, {1, {0x0231}}},\r
+ { 0x0232, {1, {0x0233}}},\r
+ { 0x023b, {1, {0x023c}}},\r
+ { 0x023d, {1, {0x019a}}},\r
+ { 0x0241, {1, {0x0294}}},\r
+ { 0x0345, {1, {0x03b9}}},\r
+ { 0x0386, {1, {0x03ac}}},\r
+ { 0x0388, {1, {0x03ad}}},\r
+ { 0x0389, {1, {0x03ae}}},\r
+ { 0x038a, {1, {0x03af}}},\r
+ { 0x038c, {1, {0x03cc}}},\r
+ { 0x038e, {1, {0x03cd}}},\r
+ { 0x038f, {1, {0x03ce}}},\r
+ { 0x0390, {3, {0x03b9, 0x0308, 0x0301}}},\r
+ { 0x0391, {1, {0x03b1}}},\r
+ { 0x0392, {1, {0x03b2}}},\r
+ { 0x0393, {1, {0x03b3}}},\r
+ { 0x0394, {1, {0x03b4}}},\r
+ { 0x0395, {1, {0x03b5}}},\r
+ { 0x0396, {1, {0x03b6}}},\r
+ { 0x0397, {1, {0x03b7}}},\r
+ { 0x0398, {1, {0x03b8}}},\r
+ { 0x0399, {1, {0x03b9}}},\r
+ { 0x039a, {1, {0x03ba}}},\r
+ { 0x039b, {1, {0x03bb}}},\r
+ { 0x039c, {1, {0x03bc}}},\r
+ { 0x039d, {1, {0x03bd}}},\r
+ { 0x039e, {1, {0x03be}}},\r
+ { 0x039f, {1, {0x03bf}}},\r
+ { 0x03a0, {1, {0x03c0}}},\r
+ { 0x03a1, {1, {0x03c1}}},\r
+ { 0x03a3, {1, {0x03c3}}},\r
+ { 0x03a4, {1, {0x03c4}}},\r
+ { 0x03a5, {1, {0x03c5}}},\r
+ { 0x03a6, {1, {0x03c6}}},\r
+ { 0x03a7, {1, {0x03c7}}},\r
+ { 0x03a8, {1, {0x03c8}}},\r
+ { 0x03a9, {1, {0x03c9}}},\r
+ { 0x03aa, {1, {0x03ca}}},\r
+ { 0x03ab, {1, {0x03cb}}},\r
+ { 0x03b0, {3, {0x03c5, 0x0308, 0x0301}}},\r
+ { 0x03c2, {1, {0x03c3}}},\r
+ { 0x03d0, {1, {0x03b2}}},\r
+ { 0x03d1, {1, {0x03b8}}},\r
+ { 0x03d5, {1, {0x03c6}}},\r
+ { 0x03d6, {1, {0x03c0}}},\r
+ { 0x03d8, {1, {0x03d9}}},\r
+ { 0x03da, {1, {0x03db}}},\r
+ { 0x03dc, {1, {0x03dd}}},\r
+ { 0x03de, {1, {0x03df}}},\r
+ { 0x03e0, {1, {0x03e1}}},\r
+ { 0x03e2, {1, {0x03e3}}},\r
+ { 0x03e4, {1, {0x03e5}}},\r
+ { 0x03e6, {1, {0x03e7}}},\r
+ { 0x03e8, {1, {0x03e9}}},\r
+ { 0x03ea, {1, {0x03eb}}},\r
+ { 0x03ec, {1, {0x03ed}}},\r
+ { 0x03ee, {1, {0x03ef}}},\r
+ { 0x03f0, {1, {0x03ba}}},\r
+ { 0x03f1, {1, {0x03c1}}},\r
+ { 0x03f4, {1, {0x03b8}}},\r
+ { 0x03f5, {1, {0x03b5}}},\r
+ { 0x03f7, {1, {0x03f8}}},\r
+ { 0x03f9, {1, {0x03f2}}},\r
+ { 0x03fa, {1, {0x03fb}}},\r
+ { 0x0400, {1, {0x0450}}},\r
+ { 0x0401, {1, {0x0451}}},\r
+ { 0x0402, {1, {0x0452}}},\r
+ { 0x0403, {1, {0x0453}}},\r
+ { 0x0404, {1, {0x0454}}},\r
+ { 0x0405, {1, {0x0455}}},\r
+ { 0x0406, {1, {0x0456}}},\r
+ { 0x0407, {1, {0x0457}}},\r
+ { 0x0408, {1, {0x0458}}},\r
+ { 0x0409, {1, {0x0459}}},\r
+ { 0x040a, {1, {0x045a}}},\r
+ { 0x040b, {1, {0x045b}}},\r
+ { 0x040c, {1, {0x045c}}},\r
+ { 0x040d, {1, {0x045d}}},\r
+ { 0x040e, {1, {0x045e}}},\r
+ { 0x040f, {1, {0x045f}}},\r
+ { 0x0410, {1, {0x0430}}},\r
+ { 0x0411, {1, {0x0431}}},\r
+ { 0x0412, {1, {0x0432}}},\r
+ { 0x0413, {1, {0x0433}}},\r
+ { 0x0414, {1, {0x0434}}},\r
+ { 0x0415, {1, {0x0435}}},\r
+ { 0x0416, {1, {0x0436}}},\r
+ { 0x0417, {1, {0x0437}}},\r
+ { 0x0418, {1, {0x0438}}},\r
+ { 0x0419, {1, {0x0439}}},\r
+ { 0x041a, {1, {0x043a}}},\r
+ { 0x041b, {1, {0x043b}}},\r
+ { 0x041c, {1, {0x043c}}},\r
+ { 0x041d, {1, {0x043d}}},\r
+ { 0x041e, {1, {0x043e}}},\r
+ { 0x041f, {1, {0x043f}}},\r
+ { 0x0420, {1, {0x0440}}},\r
+ { 0x0421, {1, {0x0441}}},\r
+ { 0x0422, {1, {0x0442}}},\r
+ { 0x0423, {1, {0x0443}}},\r
+ { 0x0424, {1, {0x0444}}},\r
+ { 0x0425, {1, {0x0445}}},\r
+ { 0x0426, {1, {0x0446}}},\r
+ { 0x0427, {1, {0x0447}}},\r
+ { 0x0428, {1, {0x0448}}},\r
+ { 0x0429, {1, {0x0449}}},\r
+ { 0x042a, {1, {0x044a}}},\r
+ { 0x042b, {1, {0x044b}}},\r
+ { 0x042c, {1, {0x044c}}},\r
+ { 0x042d, {1, {0x044d}}},\r
+ { 0x042e, {1, {0x044e}}},\r
+ { 0x042f, {1, {0x044f}}},\r
+ { 0x0460, {1, {0x0461}}},\r
+ { 0x0462, {1, {0x0463}}},\r
+ { 0x0464, {1, {0x0465}}},\r
+ { 0x0466, {1, {0x0467}}},\r
+ { 0x0468, {1, {0x0469}}},\r
+ { 0x046a, {1, {0x046b}}},\r
+ { 0x046c, {1, {0x046d}}},\r
+ { 0x046e, {1, {0x046f}}},\r
+ { 0x0470, {1, {0x0471}}},\r
+ { 0x0472, {1, {0x0473}}},\r
+ { 0x0474, {1, {0x0475}}},\r
+ { 0x0476, {1, {0x0477}}},\r
+ { 0x0478, {1, {0x0479}}},\r
+ { 0x047a, {1, {0x047b}}},\r
+ { 0x047c, {1, {0x047d}}},\r
+ { 0x047e, {1, {0x047f}}},\r
+ { 0x0480, {1, {0x0481}}},\r
+ { 0x048a, {1, {0x048b}}},\r
+ { 0x048c, {1, {0x048d}}},\r
+ { 0x048e, {1, {0x048f}}},\r
+ { 0x0490, {1, {0x0491}}},\r
+ { 0x0492, {1, {0x0493}}},\r
+ { 0x0494, {1, {0x0495}}},\r
+ { 0x0496, {1, {0x0497}}},\r
+ { 0x0498, {1, {0x0499}}},\r
+ { 0x049a, {1, {0x049b}}},\r
+ { 0x049c, {1, {0x049d}}},\r
+ { 0x049e, {1, {0x049f}}},\r
+ { 0x04a0, {1, {0x04a1}}},\r
+ { 0x04a2, {1, {0x04a3}}},\r
+ { 0x04a4, {1, {0x04a5}}},\r
+ { 0x04a6, {1, {0x04a7}}},\r
+ { 0x04a8, {1, {0x04a9}}},\r
+ { 0x04aa, {1, {0x04ab}}},\r
+ { 0x04ac, {1, {0x04ad}}},\r
+ { 0x04ae, {1, {0x04af}}},\r
+ { 0x04b0, {1, {0x04b1}}},\r
+ { 0x04b2, {1, {0x04b3}}},\r
+ { 0x04b4, {1, {0x04b5}}},\r
+ { 0x04b6, {1, {0x04b7}}},\r
+ { 0x04b8, {1, {0x04b9}}},\r
+ { 0x04ba, {1, {0x04bb}}},\r
+ { 0x04bc, {1, {0x04bd}}},\r
+ { 0x04be, {1, {0x04bf}}},\r
+ { 0x04c1, {1, {0x04c2}}},\r
+ { 0x04c3, {1, {0x04c4}}},\r
+ { 0x04c5, {1, {0x04c6}}},\r
+ { 0x04c7, {1, {0x04c8}}},\r
+ { 0x04c9, {1, {0x04ca}}},\r
+ { 0x04cb, {1, {0x04cc}}},\r
+ { 0x04cd, {1, {0x04ce}}},\r
+ { 0x04d0, {1, {0x04d1}}},\r
+ { 0x04d2, {1, {0x04d3}}},\r
+ { 0x04d4, {1, {0x04d5}}},\r
+ { 0x04d6, {1, {0x04d7}}},\r
+ { 0x04d8, {1, {0x04d9}}},\r
+ { 0x04da, {1, {0x04db}}},\r
+ { 0x04dc, {1, {0x04dd}}},\r
+ { 0x04de, {1, {0x04df}}},\r
+ { 0x04e0, {1, {0x04e1}}},\r
+ { 0x04e2, {1, {0x04e3}}},\r
+ { 0x04e4, {1, {0x04e5}}},\r
+ { 0x04e6, {1, {0x04e7}}},\r
+ { 0x04e8, {1, {0x04e9}}},\r
+ { 0x04ea, {1, {0x04eb}}},\r
+ { 0x04ec, {1, {0x04ed}}},\r
+ { 0x04ee, {1, {0x04ef}}},\r
+ { 0x04f0, {1, {0x04f1}}},\r
+ { 0x04f2, {1, {0x04f3}}},\r
+ { 0x04f4, {1, {0x04f5}}},\r
+ { 0x04f6, {1, {0x04f7}}},\r
+ { 0x04f8, {1, {0x04f9}}},\r
+ { 0x0500, {1, {0x0501}}},\r
+ { 0x0502, {1, {0x0503}}},\r
+ { 0x0504, {1, {0x0505}}},\r
+ { 0x0506, {1, {0x0507}}},\r
+ { 0x0508, {1, {0x0509}}},\r
+ { 0x050a, {1, {0x050b}}},\r
+ { 0x050c, {1, {0x050d}}},\r
+ { 0x050e, {1, {0x050f}}},\r
+ { 0x0531, {1, {0x0561}}},\r
+ { 0x0532, {1, {0x0562}}},\r
+ { 0x0533, {1, {0x0563}}},\r
+ { 0x0534, {1, {0x0564}}},\r
+ { 0x0535, {1, {0x0565}}},\r
+ { 0x0536, {1, {0x0566}}},\r
+ { 0x0537, {1, {0x0567}}},\r
+ { 0x0538, {1, {0x0568}}},\r
+ { 0x0539, {1, {0x0569}}},\r
+ { 0x053a, {1, {0x056a}}},\r
+ { 0x053b, {1, {0x056b}}},\r
+ { 0x053c, {1, {0x056c}}},\r
+ { 0x053d, {1, {0x056d}}},\r
+ { 0x053e, {1, {0x056e}}},\r
+ { 0x053f, {1, {0x056f}}},\r
+ { 0x0540, {1, {0x0570}}},\r
+ { 0x0541, {1, {0x0571}}},\r
+ { 0x0542, {1, {0x0572}}},\r
+ { 0x0543, {1, {0x0573}}},\r
+ { 0x0544, {1, {0x0574}}},\r
+ { 0x0545, {1, {0x0575}}},\r
+ { 0x0546, {1, {0x0576}}},\r
+ { 0x0547, {1, {0x0577}}},\r
+ { 0x0548, {1, {0x0578}}},\r
+ { 0x0549, {1, {0x0579}}},\r
+ { 0x054a, {1, {0x057a}}},\r
+ { 0x054b, {1, {0x057b}}},\r
+ { 0x054c, {1, {0x057c}}},\r
+ { 0x054d, {1, {0x057d}}},\r
+ { 0x054e, {1, {0x057e}}},\r
+ { 0x054f, {1, {0x057f}}},\r
+ { 0x0550, {1, {0x0580}}},\r
+ { 0x0551, {1, {0x0581}}},\r
+ { 0x0552, {1, {0x0582}}},\r
+ { 0x0553, {1, {0x0583}}},\r
+ { 0x0554, {1, {0x0584}}},\r
+ { 0x0555, {1, {0x0585}}},\r
+ { 0x0556, {1, {0x0586}}},\r
+ { 0x0587, {2, {0x0565, 0x0582}}},\r
+ { 0x10a0, {1, {0x2d00}}},\r
+ { 0x10a1, {1, {0x2d01}}},\r
+ { 0x10a2, {1, {0x2d02}}},\r
+ { 0x10a3, {1, {0x2d03}}},\r
+ { 0x10a4, {1, {0x2d04}}},\r
+ { 0x10a5, {1, {0x2d05}}},\r
+ { 0x10a6, {1, {0x2d06}}},\r
+ { 0x10a7, {1, {0x2d07}}},\r
+ { 0x10a8, {1, {0x2d08}}},\r
+ { 0x10a9, {1, {0x2d09}}},\r
+ { 0x10aa, {1, {0x2d0a}}},\r
+ { 0x10ab, {1, {0x2d0b}}},\r
+ { 0x10ac, {1, {0x2d0c}}},\r
+ { 0x10ad, {1, {0x2d0d}}},\r
+ { 0x10ae, {1, {0x2d0e}}},\r
+ { 0x10af, {1, {0x2d0f}}},\r
+ { 0x10b0, {1, {0x2d10}}},\r
+ { 0x10b1, {1, {0x2d11}}},\r
+ { 0x10b2, {1, {0x2d12}}},\r
+ { 0x10b3, {1, {0x2d13}}},\r
+ { 0x10b4, {1, {0x2d14}}},\r
+ { 0x10b5, {1, {0x2d15}}},\r
+ { 0x10b6, {1, {0x2d16}}},\r
+ { 0x10b7, {1, {0x2d17}}},\r
+ { 0x10b8, {1, {0x2d18}}},\r
+ { 0x10b9, {1, {0x2d19}}},\r
+ { 0x10ba, {1, {0x2d1a}}},\r
+ { 0x10bb, {1, {0x2d1b}}},\r
+ { 0x10bc, {1, {0x2d1c}}},\r
+ { 0x10bd, {1, {0x2d1d}}},\r
+ { 0x10be, {1, {0x2d1e}}},\r
+ { 0x10bf, {1, {0x2d1f}}},\r
+ { 0x10c0, {1, {0x2d20}}},\r
+ { 0x10c1, {1, {0x2d21}}},\r
+ { 0x10c2, {1, {0x2d22}}},\r
+ { 0x10c3, {1, {0x2d23}}},\r
+ { 0x10c4, {1, {0x2d24}}},\r
+ { 0x10c5, {1, {0x2d25}}},\r
+ { 0x1e00, {1, {0x1e01}}},\r
+ { 0x1e02, {1, {0x1e03}}},\r
+ { 0x1e04, {1, {0x1e05}}},\r
+ { 0x1e06, {1, {0x1e07}}},\r
+ { 0x1e08, {1, {0x1e09}}},\r
+ { 0x1e0a, {1, {0x1e0b}}},\r
+ { 0x1e0c, {1, {0x1e0d}}},\r
+ { 0x1e0e, {1, {0x1e0f}}},\r
+ { 0x1e10, {1, {0x1e11}}},\r
+ { 0x1e12, {1, {0x1e13}}},\r
+ { 0x1e14, {1, {0x1e15}}},\r
+ { 0x1e16, {1, {0x1e17}}},\r
+ { 0x1e18, {1, {0x1e19}}},\r
+ { 0x1e1a, {1, {0x1e1b}}},\r
+ { 0x1e1c, {1, {0x1e1d}}},\r
+ { 0x1e1e, {1, {0x1e1f}}},\r
+ { 0x1e20, {1, {0x1e21}}},\r
+ { 0x1e22, {1, {0x1e23}}},\r
+ { 0x1e24, {1, {0x1e25}}},\r
+ { 0x1e26, {1, {0x1e27}}},\r
+ { 0x1e28, {1, {0x1e29}}},\r
+ { 0x1e2a, {1, {0x1e2b}}},\r
+ { 0x1e2c, {1, {0x1e2d}}},\r
+ { 0x1e2e, {1, {0x1e2f}}},\r
+ { 0x1e30, {1, {0x1e31}}},\r
+ { 0x1e32, {1, {0x1e33}}},\r
+ { 0x1e34, {1, {0x1e35}}},\r
+ { 0x1e36, {1, {0x1e37}}},\r
+ { 0x1e38, {1, {0x1e39}}},\r
+ { 0x1e3a, {1, {0x1e3b}}},\r
+ { 0x1e3c, {1, {0x1e3d}}},\r
+ { 0x1e3e, {1, {0x1e3f}}},\r
+ { 0x1e40, {1, {0x1e41}}},\r
+ { 0x1e42, {1, {0x1e43}}},\r
+ { 0x1e44, {1, {0x1e45}}},\r
+ { 0x1e46, {1, {0x1e47}}},\r
+ { 0x1e48, {1, {0x1e49}}},\r
+ { 0x1e4a, {1, {0x1e4b}}},\r
+ { 0x1e4c, {1, {0x1e4d}}},\r
+ { 0x1e4e, {1, {0x1e4f}}},\r
+ { 0x1e50, {1, {0x1e51}}},\r
+ { 0x1e52, {1, {0x1e53}}},\r
+ { 0x1e54, {1, {0x1e55}}},\r
+ { 0x1e56, {1, {0x1e57}}},\r
+ { 0x1e58, {1, {0x1e59}}},\r
+ { 0x1e5a, {1, {0x1e5b}}},\r
+ { 0x1e5c, {1, {0x1e5d}}},\r
+ { 0x1e5e, {1, {0x1e5f}}},\r
+ { 0x1e60, {1, {0x1e61}}},\r
+ { 0x1e62, {1, {0x1e63}}},\r
+ { 0x1e64, {1, {0x1e65}}},\r
+ { 0x1e66, {1, {0x1e67}}},\r
+ { 0x1e68, {1, {0x1e69}}},\r
+ { 0x1e6a, {1, {0x1e6b}}},\r
+ { 0x1e6c, {1, {0x1e6d}}},\r
+ { 0x1e6e, {1, {0x1e6f}}},\r
+ { 0x1e70, {1, {0x1e71}}},\r
+ { 0x1e72, {1, {0x1e73}}},\r
+ { 0x1e74, {1, {0x1e75}}},\r
+ { 0x1e76, {1, {0x1e77}}},\r
+ { 0x1e78, {1, {0x1e79}}},\r
+ { 0x1e7a, {1, {0x1e7b}}},\r
+ { 0x1e7c, {1, {0x1e7d}}},\r
+ { 0x1e7e, {1, {0x1e7f}}},\r
+ { 0x1e80, {1, {0x1e81}}},\r
+ { 0x1e82, {1, {0x1e83}}},\r
+ { 0x1e84, {1, {0x1e85}}},\r
+ { 0x1e86, {1, {0x1e87}}},\r
+ { 0x1e88, {1, {0x1e89}}},\r
+ { 0x1e8a, {1, {0x1e8b}}},\r
+ { 0x1e8c, {1, {0x1e8d}}},\r
+ { 0x1e8e, {1, {0x1e8f}}},\r
+ { 0x1e90, {1, {0x1e91}}},\r
+ { 0x1e92, {1, {0x1e93}}},\r
+ { 0x1e94, {1, {0x1e95}}},\r
+ { 0x1e96, {2, {0x0068, 0x0331}}},\r
+ { 0x1e97, {2, {0x0074, 0x0308}}},\r
+ { 0x1e98, {2, {0x0077, 0x030a}}},\r
+ { 0x1e99, {2, {0x0079, 0x030a}}},\r
+ { 0x1e9a, {2, {0x0061, 0x02be}}},\r
+ { 0x1e9b, {1, {0x1e61}}},\r
+ { 0x1ea0, {1, {0x1ea1}}},\r
+ { 0x1ea2, {1, {0x1ea3}}},\r
+ { 0x1ea4, {1, {0x1ea5}}},\r
+ { 0x1ea6, {1, {0x1ea7}}},\r
+ { 0x1ea8, {1, {0x1ea9}}},\r
+ { 0x1eaa, {1, {0x1eab}}},\r
+ { 0x1eac, {1, {0x1ead}}},\r
+ { 0x1eae, {1, {0x1eaf}}},\r
+ { 0x1eb0, {1, {0x1eb1}}},\r
+ { 0x1eb2, {1, {0x1eb3}}},\r
+ { 0x1eb4, {1, {0x1eb5}}},\r
+ { 0x1eb6, {1, {0x1eb7}}},\r
+ { 0x1eb8, {1, {0x1eb9}}},\r
+ { 0x1eba, {1, {0x1ebb}}},\r
+ { 0x1ebc, {1, {0x1ebd}}},\r
+ { 0x1ebe, {1, {0x1ebf}}},\r
+ { 0x1ec0, {1, {0x1ec1}}},\r
+ { 0x1ec2, {1, {0x1ec3}}},\r
+ { 0x1ec4, {1, {0x1ec5}}},\r
+ { 0x1ec6, {1, {0x1ec7}}},\r
+ { 0x1ec8, {1, {0x1ec9}}},\r
+ { 0x1eca, {1, {0x1ecb}}},\r
+ { 0x1ecc, {1, {0x1ecd}}},\r
+ { 0x1ece, {1, {0x1ecf}}},\r
+ { 0x1ed0, {1, {0x1ed1}}},\r
+ { 0x1ed2, {1, {0x1ed3}}},\r
+ { 0x1ed4, {1, {0x1ed5}}},\r
+ { 0x1ed6, {1, {0x1ed7}}},\r
+ { 0x1ed8, {1, {0x1ed9}}},\r
+ { 0x1eda, {1, {0x1edb}}},\r
+ { 0x1edc, {1, {0x1edd}}},\r
+ { 0x1ede, {1, {0x1edf}}},\r
+ { 0x1ee0, {1, {0x1ee1}}},\r
+ { 0x1ee2, {1, {0x1ee3}}},\r
+ { 0x1ee4, {1, {0x1ee5}}},\r
+ { 0x1ee6, {1, {0x1ee7}}},\r
+ { 0x1ee8, {1, {0x1ee9}}},\r
+ { 0x1eea, {1, {0x1eeb}}},\r
+ { 0x1eec, {1, {0x1eed}}},\r
+ { 0x1eee, {1, {0x1eef}}},\r
+ { 0x1ef0, {1, {0x1ef1}}},\r
+ { 0x1ef2, {1, {0x1ef3}}},\r
+ { 0x1ef4, {1, {0x1ef5}}},\r
+ { 0x1ef6, {1, {0x1ef7}}},\r
+ { 0x1ef8, {1, {0x1ef9}}},\r
+ { 0x1f08, {1, {0x1f00}}},\r
+ { 0x1f09, {1, {0x1f01}}},\r
+ { 0x1f0a, {1, {0x1f02}}},\r
+ { 0x1f0b, {1, {0x1f03}}},\r
+ { 0x1f0c, {1, {0x1f04}}},\r
+ { 0x1f0d, {1, {0x1f05}}},\r
+ { 0x1f0e, {1, {0x1f06}}},\r
+ { 0x1f0f, {1, {0x1f07}}},\r
+ { 0x1f18, {1, {0x1f10}}},\r
+ { 0x1f19, {1, {0x1f11}}},\r
+ { 0x1f1a, {1, {0x1f12}}},\r
+ { 0x1f1b, {1, {0x1f13}}},\r
+ { 0x1f1c, {1, {0x1f14}}},\r
+ { 0x1f1d, {1, {0x1f15}}},\r
+ { 0x1f28, {1, {0x1f20}}},\r
+ { 0x1f29, {1, {0x1f21}}},\r
+ { 0x1f2a, {1, {0x1f22}}},\r
+ { 0x1f2b, {1, {0x1f23}}},\r
+ { 0x1f2c, {1, {0x1f24}}},\r
+ { 0x1f2d, {1, {0x1f25}}},\r
+ { 0x1f2e, {1, {0x1f26}}},\r
+ { 0x1f2f, {1, {0x1f27}}},\r
+ { 0x1f38, {1, {0x1f30}}},\r
+ { 0x1f39, {1, {0x1f31}}},\r
+ { 0x1f3a, {1, {0x1f32}}},\r
+ { 0x1f3b, {1, {0x1f33}}},\r
+ { 0x1f3c, {1, {0x1f34}}},\r
+ { 0x1f3d, {1, {0x1f35}}},\r
+ { 0x1f3e, {1, {0x1f36}}},\r
+ { 0x1f3f, {1, {0x1f37}}},\r
+ { 0x1f48, {1, {0x1f40}}},\r
+ { 0x1f49, {1, {0x1f41}}},\r
+ { 0x1f4a, {1, {0x1f42}}},\r
+ { 0x1f4b, {1, {0x1f43}}},\r
+ { 0x1f4c, {1, {0x1f44}}},\r
+ { 0x1f4d, {1, {0x1f45}}},\r
+ { 0x1f50, {2, {0x03c5, 0x0313}}},\r
+ { 0x1f52, {3, {0x03c5, 0x0313, 0x0300}}},\r
+ { 0x1f54, {3, {0x03c5, 0x0313, 0x0301}}},\r
+ { 0x1f56, {3, {0x03c5, 0x0313, 0x0342}}},\r
+ { 0x1f59, {1, {0x1f51}}},\r
+ { 0x1f5b, {1, {0x1f53}}},\r
+ { 0x1f5d, {1, {0x1f55}}},\r
+ { 0x1f5f, {1, {0x1f57}}},\r
+ { 0x1f68, {1, {0x1f60}}},\r
+ { 0x1f69, {1, {0x1f61}}},\r
+ { 0x1f6a, {1, {0x1f62}}},\r
+ { 0x1f6b, {1, {0x1f63}}},\r
+ { 0x1f6c, {1, {0x1f64}}},\r
+ { 0x1f6d, {1, {0x1f65}}},\r
+ { 0x1f6e, {1, {0x1f66}}},\r
+ { 0x1f6f, {1, {0x1f67}}},\r
+ { 0x1f80, {2, {0x1f00, 0x03b9}}},\r
+ { 0x1f81, {2, {0x1f01, 0x03b9}}},\r
+ { 0x1f82, {2, {0x1f02, 0x03b9}}},\r
+ { 0x1f83, {2, {0x1f03, 0x03b9}}},\r
+ { 0x1f84, {2, {0x1f04, 0x03b9}}},\r
+ { 0x1f85, {2, {0x1f05, 0x03b9}}},\r
+ { 0x1f86, {2, {0x1f06, 0x03b9}}},\r
+ { 0x1f87, {2, {0x1f07, 0x03b9}}},\r
+ { 0x1f88, {2, {0x1f00, 0x03b9}}},\r
+ { 0x1f89, {2, {0x1f01, 0x03b9}}},\r
+ { 0x1f8a, {2, {0x1f02, 0x03b9}}},\r
+ { 0x1f8b, {2, {0x1f03, 0x03b9}}},\r
+ { 0x1f8c, {2, {0x1f04, 0x03b9}}},\r
+ { 0x1f8d, {2, {0x1f05, 0x03b9}}},\r
+ { 0x1f8e, {2, {0x1f06, 0x03b9}}},\r
+ { 0x1f8f, {2, {0x1f07, 0x03b9}}},\r
+ { 0x1f90, {2, {0x1f20, 0x03b9}}},\r
+ { 0x1f91, {2, {0x1f21, 0x03b9}}},\r
+ { 0x1f92, {2, {0x1f22, 0x03b9}}},\r
+ { 0x1f93, {2, {0x1f23, 0x03b9}}},\r
+ { 0x1f94, {2, {0x1f24, 0x03b9}}},\r
+ { 0x1f95, {2, {0x1f25, 0x03b9}}},\r
+ { 0x1f96, {2, {0x1f26, 0x03b9}}},\r
+ { 0x1f97, {2, {0x1f27, 0x03b9}}},\r
+ { 0x1f98, {2, {0x1f20, 0x03b9}}},\r
+ { 0x1f99, {2, {0x1f21, 0x03b9}}},\r
+ { 0x1f9a, {2, {0x1f22, 0x03b9}}},\r
+ { 0x1f9b, {2, {0x1f23, 0x03b9}}},\r
+ { 0x1f9c, {2, {0x1f24, 0x03b9}}},\r
+ { 0x1f9d, {2, {0x1f25, 0x03b9}}},\r
+ { 0x1f9e, {2, {0x1f26, 0x03b9}}},\r
+ { 0x1f9f, {2, {0x1f27, 0x03b9}}},\r
+ { 0x1fa0, {2, {0x1f60, 0x03b9}}},\r
+ { 0x1fa1, {2, {0x1f61, 0x03b9}}},\r
+ { 0x1fa2, {2, {0x1f62, 0x03b9}}},\r
+ { 0x1fa3, {2, {0x1f63, 0x03b9}}},\r
+ { 0x1fa4, {2, {0x1f64, 0x03b9}}},\r
+ { 0x1fa5, {2, {0x1f65, 0x03b9}}},\r
+ { 0x1fa6, {2, {0x1f66, 0x03b9}}},\r
+ { 0x1fa7, {2, {0x1f67, 0x03b9}}},\r
+ { 0x1fa8, {2, {0x1f60, 0x03b9}}},\r
+ { 0x1fa9, {2, {0x1f61, 0x03b9}}},\r
+ { 0x1faa, {2, {0x1f62, 0x03b9}}},\r
+ { 0x1fab, {2, {0x1f63, 0x03b9}}},\r
+ { 0x1fac, {2, {0x1f64, 0x03b9}}},\r
+ { 0x1fad, {2, {0x1f65, 0x03b9}}},\r
+ { 0x1fae, {2, {0x1f66, 0x03b9}}},\r
+ { 0x1faf, {2, {0x1f67, 0x03b9}}},\r
+ { 0x1fb2, {2, {0x1f70, 0x03b9}}},\r
+ { 0x1fb3, {2, {0x03b1, 0x03b9}}},\r
+ { 0x1fb4, {2, {0x03ac, 0x03b9}}},\r
+ { 0x1fb6, {2, {0x03b1, 0x0342}}},\r
+ { 0x1fb7, {3, {0x03b1, 0x0342, 0x03b9}}},\r
+ { 0x1fb8, {1, {0x1fb0}}},\r
+ { 0x1fb9, {1, {0x1fb1}}},\r
+ { 0x1fba, {1, {0x1f70}}},\r
+ { 0x1fbb, {1, {0x1f71}}},\r
+ { 0x1fbc, {2, {0x03b1, 0x03b9}}},\r
+ { 0x1fbe, {1, {0x03b9}}},\r
+ { 0x1fc2, {2, {0x1f74, 0x03b9}}},\r
+ { 0x1fc3, {2, {0x03b7, 0x03b9}}},\r
+ { 0x1fc4, {2, {0x03ae, 0x03b9}}},\r
+ { 0x1fc6, {2, {0x03b7, 0x0342}}},\r
+ { 0x1fc7, {3, {0x03b7, 0x0342, 0x03b9}}},\r
+ { 0x1fc8, {1, {0x1f72}}},\r
+ { 0x1fc9, {1, {0x1f73}}},\r
+ { 0x1fca, {1, {0x1f74}}},\r
+ { 0x1fcb, {1, {0x1f75}}},\r
+ { 0x1fcc, {2, {0x03b7, 0x03b9}}},\r
+ { 0x1fd2, {3, {0x03b9, 0x0308, 0x0300}}},\r
+ { 0x1fd3, {3, {0x03b9, 0x0308, 0x0301}}},\r
+ { 0x1fd6, {2, {0x03b9, 0x0342}}},\r
+ { 0x1fd7, {3, {0x03b9, 0x0308, 0x0342}}},\r
+ { 0x1fd8, {1, {0x1fd0}}},\r
+ { 0x1fd9, {1, {0x1fd1}}},\r
+ { 0x1fda, {1, {0x1f76}}},\r
+ { 0x1fdb, {1, {0x1f77}}},\r
+ { 0x1fe2, {3, {0x03c5, 0x0308, 0x0300}}},\r
+ { 0x1fe3, {3, {0x03c5, 0x0308, 0x0301}}},\r
+ { 0x1fe4, {2, {0x03c1, 0x0313}}},\r
+ { 0x1fe6, {2, {0x03c5, 0x0342}}},\r
+ { 0x1fe7, {3, {0x03c5, 0x0308, 0x0342}}},\r
+ { 0x1fe8, {1, {0x1fe0}}},\r
+ { 0x1fe9, {1, {0x1fe1}}},\r
+ { 0x1fea, {1, {0x1f7a}}},\r
+ { 0x1feb, {1, {0x1f7b}}},\r
+ { 0x1fec, {1, {0x1fe5}}},\r
+ { 0x1ff2, {2, {0x1f7c, 0x03b9}}},\r
+ { 0x1ff3, {2, {0x03c9, 0x03b9}}},\r
+ { 0x1ff4, {2, {0x03ce, 0x03b9}}},\r
+ { 0x1ff6, {2, {0x03c9, 0x0342}}},\r
+ { 0x1ff7, {3, {0x03c9, 0x0342, 0x03b9}}},\r
+ { 0x1ff8, {1, {0x1f78}}},\r
+ { 0x1ff9, {1, {0x1f79}}},\r
+ { 0x1ffa, {1, {0x1f7c}}},\r
+ { 0x1ffb, {1, {0x1f7d}}},\r
+ { 0x1ffc, {2, {0x03c9, 0x03b9}}},\r
+ { 0x2126, {1, {0x03c9}}},\r
+ { 0x212a, {1, {0x006b}}},\r
+ { 0x212b, {1, {0x00e5}}},\r
+ { 0x2160, {1, {0x2170}}},\r
+ { 0x2161, {1, {0x2171}}},\r
+ { 0x2162, {1, {0x2172}}},\r
+ { 0x2163, {1, {0x2173}}},\r
+ { 0x2164, {1, {0x2174}}},\r
+ { 0x2165, {1, {0x2175}}},\r
+ { 0x2166, {1, {0x2176}}},\r
+ { 0x2167, {1, {0x2177}}},\r
+ { 0x2168, {1, {0x2178}}},\r
+ { 0x2169, {1, {0x2179}}},\r
+ { 0x216a, {1, {0x217a}}},\r
+ { 0x216b, {1, {0x217b}}},\r
+ { 0x216c, {1, {0x217c}}},\r
+ { 0x216d, {1, {0x217d}}},\r
+ { 0x216e, {1, {0x217e}}},\r
+ { 0x216f, {1, {0x217f}}},\r
+ { 0x24b6, {1, {0x24d0}}},\r
+ { 0x24b7, {1, {0x24d1}}},\r
+ { 0x24b8, {1, {0x24d2}}},\r
+ { 0x24b9, {1, {0x24d3}}},\r
+ { 0x24ba, {1, {0x24d4}}},\r
+ { 0x24bb, {1, {0x24d5}}},\r
+ { 0x24bc, {1, {0x24d6}}},\r
+ { 0x24bd, {1, {0x24d7}}},\r
+ { 0x24be, {1, {0x24d8}}},\r
+ { 0x24bf, {1, {0x24d9}}},\r
+ { 0x24c0, {1, {0x24da}}},\r
+ { 0x24c1, {1, {0x24db}}},\r
+ { 0x24c2, {1, {0x24dc}}},\r
+ { 0x24c3, {1, {0x24dd}}},\r
+ { 0x24c4, {1, {0x24de}}},\r
+ { 0x24c5, {1, {0x24df}}},\r
+ { 0x24c6, {1, {0x24e0}}},\r
+ { 0x24c7, {1, {0x24e1}}},\r
+ { 0x24c8, {1, {0x24e2}}},\r
+ { 0x24c9, {1, {0x24e3}}},\r
+ { 0x24ca, {1, {0x24e4}}},\r
+ { 0x24cb, {1, {0x24e5}}},\r
+ { 0x24cc, {1, {0x24e6}}},\r
+ { 0x24cd, {1, {0x24e7}}},\r
+ { 0x24ce, {1, {0x24e8}}},\r
+ { 0x24cf, {1, {0x24e9}}},\r
+ { 0x2c00, {1, {0x2c30}}},\r
+ { 0x2c01, {1, {0x2c31}}},\r
+ { 0x2c02, {1, {0x2c32}}},\r
+ { 0x2c03, {1, {0x2c33}}},\r
+ { 0x2c04, {1, {0x2c34}}},\r
+ { 0x2c05, {1, {0x2c35}}},\r
+ { 0x2c06, {1, {0x2c36}}},\r
+ { 0x2c07, {1, {0x2c37}}},\r
+ { 0x2c08, {1, {0x2c38}}},\r
+ { 0x2c09, {1, {0x2c39}}},\r
+ { 0x2c0a, {1, {0x2c3a}}},\r
+ { 0x2c0b, {1, {0x2c3b}}},\r
+ { 0x2c0c, {1, {0x2c3c}}},\r
+ { 0x2c0d, {1, {0x2c3d}}},\r
+ { 0x2c0e, {1, {0x2c3e}}},\r
+ { 0x2c0f, {1, {0x2c3f}}},\r
+ { 0x2c10, {1, {0x2c40}}},\r
+ { 0x2c11, {1, {0x2c41}}},\r
+ { 0x2c12, {1, {0x2c42}}},\r
+ { 0x2c13, {1, {0x2c43}}},\r
+ { 0x2c14, {1, {0x2c44}}},\r
+ { 0x2c15, {1, {0x2c45}}},\r
+ { 0x2c16, {1, {0x2c46}}},\r
+ { 0x2c17, {1, {0x2c47}}},\r
+ { 0x2c18, {1, {0x2c48}}},\r
+ { 0x2c19, {1, {0x2c49}}},\r
+ { 0x2c1a, {1, {0x2c4a}}},\r
+ { 0x2c1b, {1, {0x2c4b}}},\r
+ { 0x2c1c, {1, {0x2c4c}}},\r
+ { 0x2c1d, {1, {0x2c4d}}},\r
+ { 0x2c1e, {1, {0x2c4e}}},\r
+ { 0x2c1f, {1, {0x2c4f}}},\r
+ { 0x2c20, {1, {0x2c50}}},\r
+ { 0x2c21, {1, {0x2c51}}},\r
+ { 0x2c22, {1, {0x2c52}}},\r
+ { 0x2c23, {1, {0x2c53}}},\r
+ { 0x2c24, {1, {0x2c54}}},\r
+ { 0x2c25, {1, {0x2c55}}},\r
+ { 0x2c26, {1, {0x2c56}}},\r
+ { 0x2c27, {1, {0x2c57}}},\r
+ { 0x2c28, {1, {0x2c58}}},\r
+ { 0x2c29, {1, {0x2c59}}},\r
+ { 0x2c2a, {1, {0x2c5a}}},\r
+ { 0x2c2b, {1, {0x2c5b}}},\r
+ { 0x2c2c, {1, {0x2c5c}}},\r
+ { 0x2c2d, {1, {0x2c5d}}},\r
+ { 0x2c2e, {1, {0x2c5e}}},\r
+ { 0x2c80, {1, {0x2c81}}},\r
+ { 0x2c82, {1, {0x2c83}}},\r
+ { 0x2c84, {1, {0x2c85}}},\r
+ { 0x2c86, {1, {0x2c87}}},\r
+ { 0x2c88, {1, {0x2c89}}},\r
+ { 0x2c8a, {1, {0x2c8b}}},\r
+ { 0x2c8c, {1, {0x2c8d}}},\r
+ { 0x2c8e, {1, {0x2c8f}}},\r
+ { 0x2c90, {1, {0x2c91}}},\r
+ { 0x2c92, {1, {0x2c93}}},\r
+ { 0x2c94, {1, {0x2c95}}},\r
+ { 0x2c96, {1, {0x2c97}}},\r
+ { 0x2c98, {1, {0x2c99}}},\r
+ { 0x2c9a, {1, {0x2c9b}}},\r
+ { 0x2c9c, {1, {0x2c9d}}},\r
+ { 0x2c9e, {1, {0x2c9f}}},\r
+ { 0x2ca0, {1, {0x2ca1}}},\r
+ { 0x2ca2, {1, {0x2ca3}}},\r
+ { 0x2ca4, {1, {0x2ca5}}},\r
+ { 0x2ca6, {1, {0x2ca7}}},\r
+ { 0x2ca8, {1, {0x2ca9}}},\r
+ { 0x2caa, {1, {0x2cab}}},\r
+ { 0x2cac, {1, {0x2cad}}},\r
+ { 0x2cae, {1, {0x2caf}}},\r
+ { 0x2cb0, {1, {0x2cb1}}},\r
+ { 0x2cb2, {1, {0x2cb3}}},\r
+ { 0x2cb4, {1, {0x2cb5}}},\r
+ { 0x2cb6, {1, {0x2cb7}}},\r
+ { 0x2cb8, {1, {0x2cb9}}},\r
+ { 0x2cba, {1, {0x2cbb}}},\r
+ { 0x2cbc, {1, {0x2cbd}}},\r
+ { 0x2cbe, {1, {0x2cbf}}},\r
+ { 0x2cc0, {1, {0x2cc1}}},\r
+ { 0x2cc2, {1, {0x2cc3}}},\r
+ { 0x2cc4, {1, {0x2cc5}}},\r
+ { 0x2cc6, {1, {0x2cc7}}},\r
+ { 0x2cc8, {1, {0x2cc9}}},\r
+ { 0x2cca, {1, {0x2ccb}}},\r
+ { 0x2ccc, {1, {0x2ccd}}},\r
+ { 0x2cce, {1, {0x2ccf}}},\r
+ { 0x2cd0, {1, {0x2cd1}}},\r
+ { 0x2cd2, {1, {0x2cd3}}},\r
+ { 0x2cd4, {1, {0x2cd5}}},\r
+ { 0x2cd6, {1, {0x2cd7}}},\r
+ { 0x2cd8, {1, {0x2cd9}}},\r
+ { 0x2cda, {1, {0x2cdb}}},\r
+ { 0x2cdc, {1, {0x2cdd}}},\r
+ { 0x2cde, {1, {0x2cdf}}},\r
+ { 0x2ce0, {1, {0x2ce1}}},\r
+ { 0x2ce2, {1, {0x2ce3}}},\r
+ { 0xfb00, {2, {0x0066, 0x0066}}},\r
+ { 0xfb01, {2, {0x0066, 0x0069}}},\r
+ { 0xfb02, {2, {0x0066, 0x006c}}},\r
+ { 0xfb03, {3, {0x0066, 0x0066, 0x0069}}},\r
+ { 0xfb04, {3, {0x0066, 0x0066, 0x006c}}},\r
+ { 0xfb05, {2, {0x0073, 0x0074}}},\r
+ { 0xfb06, {2, {0x0073, 0x0074}}},\r
+ { 0xfb13, {2, {0x0574, 0x0576}}},\r
+ { 0xfb14, {2, {0x0574, 0x0565}}},\r
+ { 0xfb15, {2, {0x0574, 0x056b}}},\r
+ { 0xfb16, {2, {0x057e, 0x0576}}},\r
+ { 0xfb17, {2, {0x0574, 0x056d}}},\r
+ { 0xff21, {1, {0xff41}}},\r
+ { 0xff22, {1, {0xff42}}},\r
+ { 0xff23, {1, {0xff43}}},\r
+ { 0xff24, {1, {0xff44}}},\r
+ { 0xff25, {1, {0xff45}}},\r
+ { 0xff26, {1, {0xff46}}},\r
+ { 0xff27, {1, {0xff47}}},\r
+ { 0xff28, {1, {0xff48}}},\r
+ { 0xff29, {1, {0xff49}}},\r
+ { 0xff2a, {1, {0xff4a}}},\r
+ { 0xff2b, {1, {0xff4b}}},\r
+ { 0xff2c, {1, {0xff4c}}},\r
+ { 0xff2d, {1, {0xff4d}}},\r
+ { 0xff2e, {1, {0xff4e}}},\r
+ { 0xff2f, {1, {0xff4f}}},\r
+ { 0xff30, {1, {0xff50}}},\r
+ { 0xff31, {1, {0xff51}}},\r
+ { 0xff32, {1, {0xff52}}},\r
+ { 0xff33, {1, {0xff53}}},\r
+ { 0xff34, {1, {0xff54}}},\r
+ { 0xff35, {1, {0xff55}}},\r
+ { 0xff36, {1, {0xff56}}},\r
+ { 0xff37, {1, {0xff57}}},\r
+ { 0xff38, {1, {0xff58}}},\r
+ { 0xff39, {1, {0xff59}}},\r
+ { 0xff3a, {1, {0xff5a}}},\r
+ { 0x10400, {1, {0x10428}}},\r
+ { 0x10401, {1, {0x10429}}},\r
+ { 0x10402, {1, {0x1042a}}},\r
+ { 0x10403, {1, {0x1042b}}},\r
+ { 0x10404, {1, {0x1042c}}},\r
+ { 0x10405, {1, {0x1042d}}},\r
+ { 0x10406, {1, {0x1042e}}},\r
+ { 0x10407, {1, {0x1042f}}},\r
+ { 0x10408, {1, {0x10430}}},\r
+ { 0x10409, {1, {0x10431}}},\r
+ { 0x1040a, {1, {0x10432}}},\r
+ { 0x1040b, {1, {0x10433}}},\r
+ { 0x1040c, {1, {0x10434}}},\r
+ { 0x1040d, {1, {0x10435}}},\r
+ { 0x1040e, {1, {0x10436}}},\r
+ { 0x1040f, {1, {0x10437}}},\r
+ { 0x10410, {1, {0x10438}}},\r
+ { 0x10411, {1, {0x10439}}},\r
+ { 0x10412, {1, {0x1043a}}},\r
+ { 0x10413, {1, {0x1043b}}},\r
+ { 0x10414, {1, {0x1043c}}},\r
+ { 0x10415, {1, {0x1043d}}},\r
+ { 0x10416, {1, {0x1043e}}},\r
+ { 0x10417, {1, {0x1043f}}},\r
+ { 0x10418, {1, {0x10440}}},\r
+ { 0x10419, {1, {0x10441}}},\r
+ { 0x1041a, {1, {0x10442}}},\r
+ { 0x1041b, {1, {0x10443}}},\r
+ { 0x1041c, {1, {0x10444}}},\r
+ { 0x1041d, {1, {0x10445}}},\r
+ { 0x1041e, {1, {0x10446}}},\r
+ { 0x1041f, {1, {0x10447}}},\r
+ { 0x10420, {1, {0x10448}}},\r
+ { 0x10421, {1, {0x10449}}},\r
+ { 0x10422, {1, {0x1044a}}},\r
+ { 0x10423, {1, {0x1044b}}},\r
+ { 0x10424, {1, {0x1044c}}},\r
+ { 0x10425, {1, {0x1044d}}},\r
+ { 0x10426, {1, {0x1044e}}},\r
+ { 0x10427, {1, {0x1044f}}}\r
+};\r
+\r
+static const CaseFold_11_Type CaseFold_Locale[] = {\r
+ { 0x0049, {1, {0x0069}}},\r
+ { 0x0130, {2, {0x0069, 0x0307}}}\r
+};\r
+\r
+static const CaseUnfold_11_Type CaseUnfold_11[] = {\r
+ { 0x0061, {1, {0x0041 }}},\r
+ { 0x0062, {1, {0x0042 }}},\r
+ { 0x0063, {1, {0x0043 }}},\r
+ { 0x0064, {1, {0x0044 }}},\r
+ { 0x0065, {1, {0x0045 }}},\r
+ { 0x0066, {1, {0x0046 }}},\r
+ { 0x0067, {1, {0x0047 }}},\r
+ { 0x0068, {1, {0x0048 }}},\r
+ { 0x006a, {1, {0x004a }}},\r
+ { 0x006b, {2, {0x212a, 0x004b }}},\r
+ { 0x006c, {1, {0x004c }}},\r
+ { 0x006d, {1, {0x004d }}},\r
+ { 0x006e, {1, {0x004e }}},\r
+ { 0x006f, {1, {0x004f }}},\r
+ { 0x0070, {1, {0x0050 }}},\r
+ { 0x0071, {1, {0x0051 }}},\r
+ { 0x0072, {1, {0x0052 }}},\r
+ { 0x0073, {2, {0x0053, 0x017f }}},\r
+ { 0x0074, {1, {0x0054 }}},\r
+ { 0x0075, {1, {0x0055 }}},\r
+ { 0x0076, {1, {0x0056 }}},\r
+ { 0x0077, {1, {0x0057 }}},\r
+ { 0x0078, {1, {0x0058 }}},\r
+ { 0x0079, {1, {0x0059 }}},\r
+ { 0x007a, {1, {0x005a }}},\r
+ { 0x00e0, {1, {0x00c0 }}},\r
+ { 0x00e1, {1, {0x00c1 }}},\r
+ { 0x00e2, {1, {0x00c2 }}},\r
+ { 0x00e3, {1, {0x00c3 }}},\r
+ { 0x00e4, {1, {0x00c4 }}},\r
+ { 0x00e5, {2, {0x212b, 0x00c5 }}},\r
+ { 0x00e6, {1, {0x00c6 }}},\r
+ { 0x00e7, {1, {0x00c7 }}},\r
+ { 0x00e8, {1, {0x00c8 }}},\r
+ { 0x00e9, {1, {0x00c9 }}},\r
+ { 0x00ea, {1, {0x00ca }}},\r
+ { 0x00eb, {1, {0x00cb }}},\r
+ { 0x00ec, {1, {0x00cc }}},\r
+ { 0x00ed, {1, {0x00cd }}},\r
+ { 0x00ee, {1, {0x00ce }}},\r
+ { 0x00ef, {1, {0x00cf }}},\r
+ { 0x00f0, {1, {0x00d0 }}},\r
+ { 0x00f1, {1, {0x00d1 }}},\r
+ { 0x00f2, {1, {0x00d2 }}},\r
+ { 0x00f3, {1, {0x00d3 }}},\r
+ { 0x00f4, {1, {0x00d4 }}},\r
+ { 0x00f5, {1, {0x00d5 }}},\r
+ { 0x00f6, {1, {0x00d6 }}},\r
+ { 0x00f8, {1, {0x00d8 }}},\r
+ { 0x00f9, {1, {0x00d9 }}},\r
+ { 0x00fa, {1, {0x00da }}},\r
+ { 0x00fb, {1, {0x00db }}},\r
+ { 0x00fc, {1, {0x00dc }}},\r
+ { 0x00fd, {1, {0x00dd }}},\r
+ { 0x00fe, {1, {0x00de }}},\r
+ { 0x00ff, {1, {0x0178 }}},\r
+ { 0x0101, {1, {0x0100 }}},\r
+ { 0x0103, {1, {0x0102 }}},\r
+ { 0x0105, {1, {0x0104 }}},\r
+ { 0x0107, {1, {0x0106 }}},\r
+ { 0x0109, {1, {0x0108 }}},\r
+ { 0x010b, {1, {0x010a }}},\r
+ { 0x010d, {1, {0x010c }}},\r
+ { 0x010f, {1, {0x010e }}},\r
+ { 0x0111, {1, {0x0110 }}},\r
+ { 0x0113, {1, {0x0112 }}},\r
+ { 0x0115, {1, {0x0114 }}},\r
+ { 0x0117, {1, {0x0116 }}},\r
+ { 0x0119, {1, {0x0118 }}},\r
+ { 0x011b, {1, {0x011a }}},\r
+ { 0x011d, {1, {0x011c }}},\r
+ { 0x011f, {1, {0x011e }}},\r
+ { 0x0121, {1, {0x0120 }}},\r
+ { 0x0123, {1, {0x0122 }}},\r
+ { 0x0125, {1, {0x0124 }}},\r
+ { 0x0127, {1, {0x0126 }}},\r
+ { 0x0129, {1, {0x0128 }}},\r
+ { 0x012b, {1, {0x012a }}},\r
+ { 0x012d, {1, {0x012c }}},\r
+ { 0x012f, {1, {0x012e }}},\r
+ { 0x0133, {1, {0x0132 }}},\r
+ { 0x0135, {1, {0x0134 }}},\r
+ { 0x0137, {1, {0x0136 }}},\r
+ { 0x013a, {1, {0x0139 }}},\r
+ { 0x013c, {1, {0x013b }}},\r
+ { 0x013e, {1, {0x013d }}},\r
+ { 0x0140, {1, {0x013f }}},\r
+ { 0x0142, {1, {0x0141 }}},\r
+ { 0x0144, {1, {0x0143 }}},\r
+ { 0x0146, {1, {0x0145 }}},\r
+ { 0x0148, {1, {0x0147 }}},\r
+ { 0x014b, {1, {0x014a }}},\r
+ { 0x014d, {1, {0x014c }}},\r
+ { 0x014f, {1, {0x014e }}},\r
+ { 0x0151, {1, {0x0150 }}},\r
+ { 0x0153, {1, {0x0152 }}},\r
+ { 0x0155, {1, {0x0154 }}},\r
+ { 0x0157, {1, {0x0156 }}},\r
+ { 0x0159, {1, {0x0158 }}},\r
+ { 0x015b, {1, {0x015a }}},\r
+ { 0x015d, {1, {0x015c }}},\r
+ { 0x015f, {1, {0x015e }}},\r
+ { 0x0161, {1, {0x0160 }}},\r
+ { 0x0163, {1, {0x0162 }}},\r
+ { 0x0165, {1, {0x0164 }}},\r
+ { 0x0167, {1, {0x0166 }}},\r
+ { 0x0169, {1, {0x0168 }}},\r
+ { 0x016b, {1, {0x016a }}},\r
+ { 0x016d, {1, {0x016c }}},\r
+ { 0x016f, {1, {0x016e }}},\r
+ { 0x0171, {1, {0x0170 }}},\r
+ { 0x0173, {1, {0x0172 }}},\r
+ { 0x0175, {1, {0x0174 }}},\r
+ { 0x0177, {1, {0x0176 }}},\r
+ { 0x017a, {1, {0x0179 }}},\r
+ { 0x017c, {1, {0x017b }}},\r
+ { 0x017e, {1, {0x017d }}},\r
+ { 0x0183, {1, {0x0182 }}},\r
+ { 0x0185, {1, {0x0184 }}},\r
+ { 0x0188, {1, {0x0187 }}},\r
+ { 0x018c, {1, {0x018b }}},\r
+ { 0x0192, {1, {0x0191 }}},\r
+ { 0x0195, {1, {0x01f6 }}},\r
+ { 0x0199, {1, {0x0198 }}},\r
+ { 0x019a, {1, {0x023d }}},\r
+ { 0x019e, {1, {0x0220 }}},\r
+ { 0x01a1, {1, {0x01a0 }}},\r
+ { 0x01a3, {1, {0x01a2 }}},\r
+ { 0x01a5, {1, {0x01a4 }}},\r
+ { 0x01a8, {1, {0x01a7 }}},\r
+ { 0x01ad, {1, {0x01ac }}},\r
+ { 0x01b0, {1, {0x01af }}},\r
+ { 0x01b4, {1, {0x01b3 }}},\r
+ { 0x01b6, {1, {0x01b5 }}},\r
+ { 0x01b9, {1, {0x01b8 }}},\r
+ { 0x01bd, {1, {0x01bc }}},\r
+ { 0x01bf, {1, {0x01f7 }}},\r
+ { 0x01c6, {2, {0x01c4, 0x01c5 }}},\r
+ { 0x01c9, {2, {0x01c7, 0x01c8 }}},\r
+ { 0x01cc, {2, {0x01ca, 0x01cb }}},\r
+ { 0x01ce, {1, {0x01cd }}},\r
+ { 0x01d0, {1, {0x01cf }}},\r
+ { 0x01d2, {1, {0x01d1 }}},\r
+ { 0x01d4, {1, {0x01d3 }}},\r
+ { 0x01d6, {1, {0x01d5 }}},\r
+ { 0x01d8, {1, {0x01d7 }}},\r
+ { 0x01da, {1, {0x01d9 }}},\r
+ { 0x01dc, {1, {0x01db }}},\r
+ { 0x01dd, {1, {0x018e }}},\r
+ { 0x01df, {1, {0x01de }}},\r
+ { 0x01e1, {1, {0x01e0 }}},\r
+ { 0x01e3, {1, {0x01e2 }}},\r
+ { 0x01e5, {1, {0x01e4 }}},\r
+ { 0x01e7, {1, {0x01e6 }}},\r
+ { 0x01e9, {1, {0x01e8 }}},\r
+ { 0x01eb, {1, {0x01ea }}},\r
+ { 0x01ed, {1, {0x01ec }}},\r
+ { 0x01ef, {1, {0x01ee }}},\r
+ { 0x01f3, {2, {0x01f1, 0x01f2 }}},\r
+ { 0x01f5, {1, {0x01f4 }}},\r
+ { 0x01f9, {1, {0x01f8 }}},\r
+ { 0x01fb, {1, {0x01fa }}},\r
+ { 0x01fd, {1, {0x01fc }}},\r
+ { 0x01ff, {1, {0x01fe }}},\r
+ { 0x0201, {1, {0x0200 }}},\r
+ { 0x0203, {1, {0x0202 }}},\r
+ { 0x0205, {1, {0x0204 }}},\r
+ { 0x0207, {1, {0x0206 }}},\r
+ { 0x0209, {1, {0x0208 }}},\r
+ { 0x020b, {1, {0x020a }}},\r
+ { 0x020d, {1, {0x020c }}},\r
+ { 0x020f, {1, {0x020e }}},\r
+ { 0x0211, {1, {0x0210 }}},\r
+ { 0x0213, {1, {0x0212 }}},\r
+ { 0x0215, {1, {0x0214 }}},\r
+ { 0x0217, {1, {0x0216 }}},\r
+ { 0x0219, {1, {0x0218 }}},\r
+ { 0x021b, {1, {0x021a }}},\r
+ { 0x021d, {1, {0x021c }}},\r
+ { 0x021f, {1, {0x021e }}},\r
+ { 0x0223, {1, {0x0222 }}},\r
+ { 0x0225, {1, {0x0224 }}},\r
+ { 0x0227, {1, {0x0226 }}},\r
+ { 0x0229, {1, {0x0228 }}},\r
+ { 0x022b, {1, {0x022a }}},\r
+ { 0x022d, {1, {0x022c }}},\r
+ { 0x022f, {1, {0x022e }}},\r
+ { 0x0231, {1, {0x0230 }}},\r
+ { 0x0233, {1, {0x0232 }}},\r
+ { 0x023c, {1, {0x023b }}},\r
+ { 0x0253, {1, {0x0181 }}},\r
+ { 0x0254, {1, {0x0186 }}},\r
+ { 0x0256, {1, {0x0189 }}},\r
+ { 0x0257, {1, {0x018a }}},\r
+ { 0x0259, {1, {0x018f }}},\r
+ { 0x025b, {1, {0x0190 }}},\r
+ { 0x0260, {1, {0x0193 }}},\r
+ { 0x0263, {1, {0x0194 }}},\r
+ { 0x0268, {1, {0x0197 }}},\r
+ { 0x0269, {1, {0x0196 }}},\r
+ { 0x026f, {1, {0x019c }}},\r
+ { 0x0272, {1, {0x019d }}},\r
+ { 0x0275, {1, {0x019f }}},\r
+ { 0x0280, {1, {0x01a6 }}},\r
+ { 0x0283, {1, {0x01a9 }}},\r
+ { 0x0288, {1, {0x01ae }}},\r
+ { 0x028a, {1, {0x01b1 }}},\r
+ { 0x028b, {1, {0x01b2 }}},\r
+ { 0x0292, {1, {0x01b7 }}},\r
+ { 0x0294, {1, {0x0241 }}},\r
+ { 0x03ac, {1, {0x0386 }}},\r
+ { 0x03ad, {1, {0x0388 }}},\r
+ { 0x03ae, {1, {0x0389 }}},\r
+ { 0x03af, {1, {0x038a }}},\r
+ { 0x03b1, {1, {0x0391 }}},\r
+ { 0x03b2, {2, {0x0392, 0x03d0 }}},\r
+ { 0x03b3, {1, {0x0393 }}},\r
+ { 0x03b4, {1, {0x0394 }}},\r
+ { 0x03b5, {2, {0x03f5, 0x0395 }}},\r
+ { 0x03b6, {1, {0x0396 }}},\r
+ { 0x03b7, {1, {0x0397 }}},\r
+ { 0x03b8, {3, {0x03f4, 0x0398, 0x03d1 }}},\r
+ { 0x03b9, {3, {0x1fbe, 0x0399, 0x0345 }}},\r
+ { 0x03ba, {2, {0x03f0, 0x039a }}},\r
+ { 0x03bb, {1, {0x039b }}},\r
+ { 0x03bc, {2, {0x00b5, 0x039c }}},\r
+ { 0x03bd, {1, {0x039d }}},\r
+ { 0x03be, {1, {0x039e }}},\r
+ { 0x03bf, {1, {0x039f }}},\r
+ { 0x03c0, {2, {0x03a0, 0x03d6 }}},\r
+ { 0x03c1, {2, {0x03f1, 0x03a1 }}},\r
+ { 0x03c3, {2, {0x03a3, 0x03c2 }}},\r
+ { 0x03c4, {1, {0x03a4 }}},\r
+ { 0x03c5, {1, {0x03a5 }}},\r
+ { 0x03c6, {2, {0x03a6, 0x03d5 }}},\r
+ { 0x03c7, {1, {0x03a7 }}},\r
+ { 0x03c8, {1, {0x03a8 }}},\r
+ { 0x03c9, {2, {0x03a9, 0x2126 }}},\r
+ { 0x03ca, {1, {0x03aa }}},\r
+ { 0x03cb, {1, {0x03ab }}},\r
+ { 0x03cc, {1, {0x038c }}},\r
+ { 0x03cd, {1, {0x038e }}},\r
+ { 0x03ce, {1, {0x038f }}},\r
+ { 0x03d9, {1, {0x03d8 }}},\r
+ { 0x03db, {1, {0x03da }}},\r
+ { 0x03dd, {1, {0x03dc }}},\r
+ { 0x03df, {1, {0x03de }}},\r
+ { 0x03e1, {1, {0x03e0 }}},\r
+ { 0x03e3, {1, {0x03e2 }}},\r
+ { 0x03e5, {1, {0x03e4 }}},\r
+ { 0x03e7, {1, {0x03e6 }}},\r
+ { 0x03e9, {1, {0x03e8 }}},\r
+ { 0x03eb, {1, {0x03ea }}},\r
+ { 0x03ed, {1, {0x03ec }}},\r
+ { 0x03ef, {1, {0x03ee }}},\r
+ { 0x03f2, {1, {0x03f9 }}},\r
+ { 0x03f8, {1, {0x03f7 }}},\r
+ { 0x03fb, {1, {0x03fa }}},\r
+ { 0x0430, {1, {0x0410 }}},\r
+ { 0x0431, {1, {0x0411 }}},\r
+ { 0x0432, {1, {0x0412 }}},\r
+ { 0x0433, {1, {0x0413 }}},\r
+ { 0x0434, {1, {0x0414 }}},\r
+ { 0x0435, {1, {0x0415 }}},\r
+ { 0x0436, {1, {0x0416 }}},\r
+ { 0x0437, {1, {0x0417 }}},\r
+ { 0x0438, {1, {0x0418 }}},\r
+ { 0x0439, {1, {0x0419 }}},\r
+ { 0x043a, {1, {0x041a }}},\r
+ { 0x043b, {1, {0x041b }}},\r
+ { 0x043c, {1, {0x041c }}},\r
+ { 0x043d, {1, {0x041d }}},\r
+ { 0x043e, {1, {0x041e }}},\r
+ { 0x043f, {1, {0x041f }}},\r
+ { 0x0440, {1, {0x0420 }}},\r
+ { 0x0441, {1, {0x0421 }}},\r
+ { 0x0442, {1, {0x0422 }}},\r
+ { 0x0443, {1, {0x0423 }}},\r
+ { 0x0444, {1, {0x0424 }}},\r
+ { 0x0445, {1, {0x0425 }}},\r
+ { 0x0446, {1, {0x0426 }}},\r
+ { 0x0447, {1, {0x0427 }}},\r
+ { 0x0448, {1, {0x0428 }}},\r
+ { 0x0449, {1, {0x0429 }}},\r
+ { 0x044a, {1, {0x042a }}},\r
+ { 0x044b, {1, {0x042b }}},\r
+ { 0x044c, {1, {0x042c }}},\r
+ { 0x044d, {1, {0x042d }}},\r
+ { 0x044e, {1, {0x042e }}},\r
+ { 0x044f, {1, {0x042f }}},\r
+ { 0x0450, {1, {0x0400 }}},\r
+ { 0x0451, {1, {0x0401 }}},\r
+ { 0x0452, {1, {0x0402 }}},\r
+ { 0x0453, {1, {0x0403 }}},\r
+ { 0x0454, {1, {0x0404 }}},\r
+ { 0x0455, {1, {0x0405 }}},\r
+ { 0x0456, {1, {0x0406 }}},\r
+ { 0x0457, {1, {0x0407 }}},\r
+ { 0x0458, {1, {0x0408 }}},\r
+ { 0x0459, {1, {0x0409 }}},\r
+ { 0x045a, {1, {0x040a }}},\r
+ { 0x045b, {1, {0x040b }}},\r
+ { 0x045c, {1, {0x040c }}},\r
+ { 0x045d, {1, {0x040d }}},\r
+ { 0x045e, {1, {0x040e }}},\r
+ { 0x045f, {1, {0x040f }}},\r
+ { 0x0461, {1, {0x0460 }}},\r
+ { 0x0463, {1, {0x0462 }}},\r
+ { 0x0465, {1, {0x0464 }}},\r
+ { 0x0467, {1, {0x0466 }}},\r
+ { 0x0469, {1, {0x0468 }}},\r
+ { 0x046b, {1, {0x046a }}},\r
+ { 0x046d, {1, {0x046c }}},\r
+ { 0x046f, {1, {0x046e }}},\r
+ { 0x0471, {1, {0x0470 }}},\r
+ { 0x0473, {1, {0x0472 }}},\r
+ { 0x0475, {1, {0x0474 }}},\r
+ { 0x0477, {1, {0x0476 }}},\r
+ { 0x0479, {1, {0x0478 }}},\r
+ { 0x047b, {1, {0x047a }}},\r
+ { 0x047d, {1, {0x047c }}},\r
+ { 0x047f, {1, {0x047e }}},\r
+ { 0x0481, {1, {0x0480 }}},\r
+ { 0x048b, {1, {0x048a }}},\r
+ { 0x048d, {1, {0x048c }}},\r
+ { 0x048f, {1, {0x048e }}},\r
+ { 0x0491, {1, {0x0490 }}},\r
+ { 0x0493, {1, {0x0492 }}},\r
+ { 0x0495, {1, {0x0494 }}},\r
+ { 0x0497, {1, {0x0496 }}},\r
+ { 0x0499, {1, {0x0498 }}},\r
+ { 0x049b, {1, {0x049a }}},\r
+ { 0x049d, {1, {0x049c }}},\r
+ { 0x049f, {1, {0x049e }}},\r
+ { 0x04a1, {1, {0x04a0 }}},\r
+ { 0x04a3, {1, {0x04a2 }}},\r
+ { 0x04a5, {1, {0x04a4 }}},\r
+ { 0x04a7, {1, {0x04a6 }}},\r
+ { 0x04a9, {1, {0x04a8 }}},\r
+ { 0x04ab, {1, {0x04aa }}},\r
+ { 0x04ad, {1, {0x04ac }}},\r
+ { 0x04af, {1, {0x04ae }}},\r
+ { 0x04b1, {1, {0x04b0 }}},\r
+ { 0x04b3, {1, {0x04b2 }}},\r
+ { 0x04b5, {1, {0x04b4 }}},\r
+ { 0x04b7, {1, {0x04b6 }}},\r
+ { 0x04b9, {1, {0x04b8 }}},\r
+ { 0x04bb, {1, {0x04ba }}},\r
+ { 0x04bd, {1, {0x04bc }}},\r
+ { 0x04bf, {1, {0x04be }}},\r
+ { 0x04c2, {1, {0x04c1 }}},\r
+ { 0x04c4, {1, {0x04c3 }}},\r
+ { 0x04c6, {1, {0x04c5 }}},\r
+ { 0x04c8, {1, {0x04c7 }}},\r
+ { 0x04ca, {1, {0x04c9 }}},\r
+ { 0x04cc, {1, {0x04cb }}},\r
+ { 0x04ce, {1, {0x04cd }}},\r
+ { 0x04d1, {1, {0x04d0 }}},\r
+ { 0x04d3, {1, {0x04d2 }}},\r
+ { 0x04d5, {1, {0x04d4 }}},\r
+ { 0x04d7, {1, {0x04d6 }}},\r
+ { 0x04d9, {1, {0x04d8 }}},\r
+ { 0x04db, {1, {0x04da }}},\r
+ { 0x04dd, {1, {0x04dc }}},\r
+ { 0x04df, {1, {0x04de }}},\r
+ { 0x04e1, {1, {0x04e0 }}},\r
+ { 0x04e3, {1, {0x04e2 }}},\r
+ { 0x04e5, {1, {0x04e4 }}},\r
+ { 0x04e7, {1, {0x04e6 }}},\r
+ { 0x04e9, {1, {0x04e8 }}},\r
+ { 0x04eb, {1, {0x04ea }}},\r
+ { 0x04ed, {1, {0x04ec }}},\r
+ { 0x04ef, {1, {0x04ee }}},\r
+ { 0x04f1, {1, {0x04f0 }}},\r
+ { 0x04f3, {1, {0x04f2 }}},\r
+ { 0x04f5, {1, {0x04f4 }}},\r
+ { 0x04f7, {1, {0x04f6 }}},\r
+ { 0x04f9, {1, {0x04f8 }}},\r
+ { 0x0501, {1, {0x0500 }}},\r
+ { 0x0503, {1, {0x0502 }}},\r
+ { 0x0505, {1, {0x0504 }}},\r
+ { 0x0507, {1, {0x0506 }}},\r
+ { 0x0509, {1, {0x0508 }}},\r
+ { 0x050b, {1, {0x050a }}},\r
+ { 0x050d, {1, {0x050c }}},\r
+ { 0x050f, {1, {0x050e }}},\r
+ { 0x0561, {1, {0x0531 }}},\r
+ { 0x0562, {1, {0x0532 }}},\r
+ { 0x0563, {1, {0x0533 }}},\r
+ { 0x0564, {1, {0x0534 }}},\r
+ { 0x0565, {1, {0x0535 }}},\r
+ { 0x0566, {1, {0x0536 }}},\r
+ { 0x0567, {1, {0x0537 }}},\r
+ { 0x0568, {1, {0x0538 }}},\r
+ { 0x0569, {1, {0x0539 }}},\r
+ { 0x056a, {1, {0x053a }}},\r
+ { 0x056b, {1, {0x053b }}},\r
+ { 0x056c, {1, {0x053c }}},\r
+ { 0x056d, {1, {0x053d }}},\r
+ { 0x056e, {1, {0x053e }}},\r
+ { 0x056f, {1, {0x053f }}},\r
+ { 0x0570, {1, {0x0540 }}},\r
+ { 0x0571, {1, {0x0541 }}},\r
+ { 0x0572, {1, {0x0542 }}},\r
+ { 0x0573, {1, {0x0543 }}},\r
+ { 0x0574, {1, {0x0544 }}},\r
+ { 0x0575, {1, {0x0545 }}},\r
+ { 0x0576, {1, {0x0546 }}},\r
+ { 0x0577, {1, {0x0547 }}},\r
+ { 0x0578, {1, {0x0548 }}},\r
+ { 0x0579, {1, {0x0549 }}},\r
+ { 0x057a, {1, {0x054a }}},\r
+ { 0x057b, {1, {0x054b }}},\r
+ { 0x057c, {1, {0x054c }}},\r
+ { 0x057d, {1, {0x054d }}},\r
+ { 0x057e, {1, {0x054e }}},\r
+ { 0x057f, {1, {0x054f }}},\r
+ { 0x0580, {1, {0x0550 }}},\r
+ { 0x0581, {1, {0x0551 }}},\r
+ { 0x0582, {1, {0x0552 }}},\r
+ { 0x0583, {1, {0x0553 }}},\r
+ { 0x0584, {1, {0x0554 }}},\r
+ { 0x0585, {1, {0x0555 }}},\r
+ { 0x0586, {1, {0x0556 }}},\r
+ { 0x1e01, {1, {0x1e00 }}},\r
+ { 0x1e03, {1, {0x1e02 }}},\r
+ { 0x1e05, {1, {0x1e04 }}},\r
+ { 0x1e07, {1, {0x1e06 }}},\r
+ { 0x1e09, {1, {0x1e08 }}},\r
+ { 0x1e0b, {1, {0x1e0a }}},\r
+ { 0x1e0d, {1, {0x1e0c }}},\r
+ { 0x1e0f, {1, {0x1e0e }}},\r
+ { 0x1e11, {1, {0x1e10 }}},\r
+ { 0x1e13, {1, {0x1e12 }}},\r
+ { 0x1e15, {1, {0x1e14 }}},\r
+ { 0x1e17, {1, {0x1e16 }}},\r
+ { 0x1e19, {1, {0x1e18 }}},\r
+ { 0x1e1b, {1, {0x1e1a }}},\r
+ { 0x1e1d, {1, {0x1e1c }}},\r
+ { 0x1e1f, {1, {0x1e1e }}},\r
+ { 0x1e21, {1, {0x1e20 }}},\r
+ { 0x1e23, {1, {0x1e22 }}},\r
+ { 0x1e25, {1, {0x1e24 }}},\r
+ { 0x1e27, {1, {0x1e26 }}},\r
+ { 0x1e29, {1, {0x1e28 }}},\r
+ { 0x1e2b, {1, {0x1e2a }}},\r
+ { 0x1e2d, {1, {0x1e2c }}},\r
+ { 0x1e2f, {1, {0x1e2e }}},\r
+ { 0x1e31, {1, {0x1e30 }}},\r
+ { 0x1e33, {1, {0x1e32 }}},\r
+ { 0x1e35, {1, {0x1e34 }}},\r
+ { 0x1e37, {1, {0x1e36 }}},\r
+ { 0x1e39, {1, {0x1e38 }}},\r
+ { 0x1e3b, {1, {0x1e3a }}},\r
+ { 0x1e3d, {1, {0x1e3c }}},\r
+ { 0x1e3f, {1, {0x1e3e }}},\r
+ { 0x1e41, {1, {0x1e40 }}},\r
+ { 0x1e43, {1, {0x1e42 }}},\r
+ { 0x1e45, {1, {0x1e44 }}},\r
+ { 0x1e47, {1, {0x1e46 }}},\r
+ { 0x1e49, {1, {0x1e48 }}},\r
+ { 0x1e4b, {1, {0x1e4a }}},\r
+ { 0x1e4d, {1, {0x1e4c }}},\r
+ { 0x1e4f, {1, {0x1e4e }}},\r
+ { 0x1e51, {1, {0x1e50 }}},\r
+ { 0x1e53, {1, {0x1e52 }}},\r
+ { 0x1e55, {1, {0x1e54 }}},\r
+ { 0x1e57, {1, {0x1e56 }}},\r
+ { 0x1e59, {1, {0x1e58 }}},\r
+ { 0x1e5b, {1, {0x1e5a }}},\r
+ { 0x1e5d, {1, {0x1e5c }}},\r
+ { 0x1e5f, {1, {0x1e5e }}},\r
+ { 0x1e61, {2, {0x1e9b, 0x1e60 }}},\r
+ { 0x1e63, {1, {0x1e62 }}},\r
+ { 0x1e65, {1, {0x1e64 }}},\r
+ { 0x1e67, {1, {0x1e66 }}},\r
+ { 0x1e69, {1, {0x1e68 }}},\r
+ { 0x1e6b, {1, {0x1e6a }}},\r
+ { 0x1e6d, {1, {0x1e6c }}},\r
+ { 0x1e6f, {1, {0x1e6e }}},\r
+ { 0x1e71, {1, {0x1e70 }}},\r
+ { 0x1e73, {1, {0x1e72 }}},\r
+ { 0x1e75, {1, {0x1e74 }}},\r
+ { 0x1e77, {1, {0x1e76 }}},\r
+ { 0x1e79, {1, {0x1e78 }}},\r
+ { 0x1e7b, {1, {0x1e7a }}},\r
+ { 0x1e7d, {1, {0x1e7c }}},\r
+ { 0x1e7f, {1, {0x1e7e }}},\r
+ { 0x1e81, {1, {0x1e80 }}},\r
+ { 0x1e83, {1, {0x1e82 }}},\r
+ { 0x1e85, {1, {0x1e84 }}},\r
+ { 0x1e87, {1, {0x1e86 }}},\r
+ { 0x1e89, {1, {0x1e88 }}},\r
+ { 0x1e8b, {1, {0x1e8a }}},\r
+ { 0x1e8d, {1, {0x1e8c }}},\r
+ { 0x1e8f, {1, {0x1e8e }}},\r
+ { 0x1e91, {1, {0x1e90 }}},\r
+ { 0x1e93, {1, {0x1e92 }}},\r
+ { 0x1e95, {1, {0x1e94 }}},\r
+ { 0x1ea1, {1, {0x1ea0 }}},\r
+ { 0x1ea3, {1, {0x1ea2 }}},\r
+ { 0x1ea5, {1, {0x1ea4 }}},\r
+ { 0x1ea7, {1, {0x1ea6 }}},\r
+ { 0x1ea9, {1, {0x1ea8 }}},\r
+ { 0x1eab, {1, {0x1eaa }}},\r
+ { 0x1ead, {1, {0x1eac }}},\r
+ { 0x1eaf, {1, {0x1eae }}},\r
+ { 0x1eb1, {1, {0x1eb0 }}},\r
+ { 0x1eb3, {1, {0x1eb2 }}},\r
+ { 0x1eb5, {1, {0x1eb4 }}},\r
+ { 0x1eb7, {1, {0x1eb6 }}},\r
+ { 0x1eb9, {1, {0x1eb8 }}},\r
+ { 0x1ebb, {1, {0x1eba }}},\r
+ { 0x1ebd, {1, {0x1ebc }}},\r
+ { 0x1ebf, {1, {0x1ebe }}},\r
+ { 0x1ec1, {1, {0x1ec0 }}},\r
+ { 0x1ec3, {1, {0x1ec2 }}},\r
+ { 0x1ec5, {1, {0x1ec4 }}},\r
+ { 0x1ec7, {1, {0x1ec6 }}},\r
+ { 0x1ec9, {1, {0x1ec8 }}},\r
+ { 0x1ecb, {1, {0x1eca }}},\r
+ { 0x1ecd, {1, {0x1ecc }}},\r
+ { 0x1ecf, {1, {0x1ece }}},\r
+ { 0x1ed1, {1, {0x1ed0 }}},\r
+ { 0x1ed3, {1, {0x1ed2 }}},\r
+ { 0x1ed5, {1, {0x1ed4 }}},\r
+ { 0x1ed7, {1, {0x1ed6 }}},\r
+ { 0x1ed9, {1, {0x1ed8 }}},\r
+ { 0x1edb, {1, {0x1eda }}},\r
+ { 0x1edd, {1, {0x1edc }}},\r
+ { 0x1edf, {1, {0x1ede }}},\r
+ { 0x1ee1, {1, {0x1ee0 }}},\r
+ { 0x1ee3, {1, {0x1ee2 }}},\r
+ { 0x1ee5, {1, {0x1ee4 }}},\r
+ { 0x1ee7, {1, {0x1ee6 }}},\r
+ { 0x1ee9, {1, {0x1ee8 }}},\r
+ { 0x1eeb, {1, {0x1eea }}},\r
+ { 0x1eed, {1, {0x1eec }}},\r
+ { 0x1eef, {1, {0x1eee }}},\r
+ { 0x1ef1, {1, {0x1ef0 }}},\r
+ { 0x1ef3, {1, {0x1ef2 }}},\r
+ { 0x1ef5, {1, {0x1ef4 }}},\r
+ { 0x1ef7, {1, {0x1ef6 }}},\r
+ { 0x1ef9, {1, {0x1ef8 }}},\r
+ { 0x1f00, {1, {0x1f08 }}},\r
+ { 0x1f01, {1, {0x1f09 }}},\r
+ { 0x1f02, {1, {0x1f0a }}},\r
+ { 0x1f03, {1, {0x1f0b }}},\r
+ { 0x1f04, {1, {0x1f0c }}},\r
+ { 0x1f05, {1, {0x1f0d }}},\r
+ { 0x1f06, {1, {0x1f0e }}},\r
+ { 0x1f07, {1, {0x1f0f }}},\r
+ { 0x1f10, {1, {0x1f18 }}},\r
+ { 0x1f11, {1, {0x1f19 }}},\r
+ { 0x1f12, {1, {0x1f1a }}},\r
+ { 0x1f13, {1, {0x1f1b }}},\r
+ { 0x1f14, {1, {0x1f1c }}},\r
+ { 0x1f15, {1, {0x1f1d }}},\r
+ { 0x1f20, {1, {0x1f28 }}},\r
+ { 0x1f21, {1, {0x1f29 }}},\r
+ { 0x1f22, {1, {0x1f2a }}},\r
+ { 0x1f23, {1, {0x1f2b }}},\r
+ { 0x1f24, {1, {0x1f2c }}},\r
+ { 0x1f25, {1, {0x1f2d }}},\r
+ { 0x1f26, {1, {0x1f2e }}},\r
+ { 0x1f27, {1, {0x1f2f }}},\r
+ { 0x1f30, {1, {0x1f38 }}},\r
+ { 0x1f31, {1, {0x1f39 }}},\r
+ { 0x1f32, {1, {0x1f3a }}},\r
+ { 0x1f33, {1, {0x1f3b }}},\r
+ { 0x1f34, {1, {0x1f3c }}},\r
+ { 0x1f35, {1, {0x1f3d }}},\r
+ { 0x1f36, {1, {0x1f3e }}},\r
+ { 0x1f37, {1, {0x1f3f }}},\r
+ { 0x1f40, {1, {0x1f48 }}},\r
+ { 0x1f41, {1, {0x1f49 }}},\r
+ { 0x1f42, {1, {0x1f4a }}},\r
+ { 0x1f43, {1, {0x1f4b }}},\r
+ { 0x1f44, {1, {0x1f4c }}},\r
+ { 0x1f45, {1, {0x1f4d }}},\r
+ { 0x1f51, {1, {0x1f59 }}},\r
+ { 0x1f53, {1, {0x1f5b }}},\r
+ { 0x1f55, {1, {0x1f5d }}},\r
+ { 0x1f57, {1, {0x1f5f }}},\r
+ { 0x1f60, {1, {0x1f68 }}},\r
+ { 0x1f61, {1, {0x1f69 }}},\r
+ { 0x1f62, {1, {0x1f6a }}},\r
+ { 0x1f63, {1, {0x1f6b }}},\r
+ { 0x1f64, {1, {0x1f6c }}},\r
+ { 0x1f65, {1, {0x1f6d }}},\r
+ { 0x1f66, {1, {0x1f6e }}},\r
+ { 0x1f67, {1, {0x1f6f }}},\r
+ { 0x1f70, {1, {0x1fba }}},\r
+ { 0x1f71, {1, {0x1fbb }}},\r
+ { 0x1f72, {1, {0x1fc8 }}},\r
+ { 0x1f73, {1, {0x1fc9 }}},\r
+ { 0x1f74, {1, {0x1fca }}},\r
+ { 0x1f75, {1, {0x1fcb }}},\r
+ { 0x1f76, {1, {0x1fda }}},\r
+ { 0x1f77, {1, {0x1fdb }}},\r
+ { 0x1f78, {1, {0x1ff8 }}},\r
+ { 0x1f79, {1, {0x1ff9 }}},\r
+ { 0x1f7a, {1, {0x1fea }}},\r
+ { 0x1f7b, {1, {0x1feb }}},\r
+ { 0x1f7c, {1, {0x1ffa }}},\r
+ { 0x1f7d, {1, {0x1ffb }}},\r
+ { 0x1fb0, {1, {0x1fb8 }}},\r
+ { 0x1fb1, {1, {0x1fb9 }}},\r
+ { 0x1fd0, {1, {0x1fd8 }}},\r
+ { 0x1fd1, {1, {0x1fd9 }}},\r
+ { 0x1fe0, {1, {0x1fe8 }}},\r
+ { 0x1fe1, {1, {0x1fe9 }}},\r
+ { 0x1fe5, {1, {0x1fec }}},\r
+ { 0x2170, {1, {0x2160 }}},\r
+ { 0x2171, {1, {0x2161 }}},\r
+ { 0x2172, {1, {0x2162 }}},\r
+ { 0x2173, {1, {0x2163 }}},\r
+ { 0x2174, {1, {0x2164 }}},\r
+ { 0x2175, {1, {0x2165 }}},\r
+ { 0x2176, {1, {0x2166 }}},\r
+ { 0x2177, {1, {0x2167 }}},\r
+ { 0x2178, {1, {0x2168 }}},\r
+ { 0x2179, {1, {0x2169 }}},\r
+ { 0x217a, {1, {0x216a }}},\r
+ { 0x217b, {1, {0x216b }}},\r
+ { 0x217c, {1, {0x216c }}},\r
+ { 0x217d, {1, {0x216d }}},\r
+ { 0x217e, {1, {0x216e }}},\r
+ { 0x217f, {1, {0x216f }}},\r
+ { 0x24d0, {1, {0x24b6 }}},\r
+ { 0x24d1, {1, {0x24b7 }}},\r
+ { 0x24d2, {1, {0x24b8 }}},\r
+ { 0x24d3, {1, {0x24b9 }}},\r
+ { 0x24d4, {1, {0x24ba }}},\r
+ { 0x24d5, {1, {0x24bb }}},\r
+ { 0x24d6, {1, {0x24bc }}},\r
+ { 0x24d7, {1, {0x24bd }}},\r
+ { 0x24d8, {1, {0x24be }}},\r
+ { 0x24d9, {1, {0x24bf }}},\r
+ { 0x24da, {1, {0x24c0 }}},\r
+ { 0x24db, {1, {0x24c1 }}},\r
+ { 0x24dc, {1, {0x24c2 }}},\r
+ { 0x24dd, {1, {0x24c3 }}},\r
+ { 0x24de, {1, {0x24c4 }}},\r
+ { 0x24df, {1, {0x24c5 }}},\r
+ { 0x24e0, {1, {0x24c6 }}},\r
+ { 0x24e1, {1, {0x24c7 }}},\r
+ { 0x24e2, {1, {0x24c8 }}},\r
+ { 0x24e3, {1, {0x24c9 }}},\r
+ { 0x24e4, {1, {0x24ca }}},\r
+ { 0x24e5, {1, {0x24cb }}},\r
+ { 0x24e6, {1, {0x24cc }}},\r
+ { 0x24e7, {1, {0x24cd }}},\r
+ { 0x24e8, {1, {0x24ce }}},\r
+ { 0x24e9, {1, {0x24cf }}},\r
+ { 0x2c30, {1, {0x2c00 }}},\r
+ { 0x2c31, {1, {0x2c01 }}},\r
+ { 0x2c32, {1, {0x2c02 }}},\r
+ { 0x2c33, {1, {0x2c03 }}},\r
+ { 0x2c34, {1, {0x2c04 }}},\r
+ { 0x2c35, {1, {0x2c05 }}},\r
+ { 0x2c36, {1, {0x2c06 }}},\r
+ { 0x2c37, {1, {0x2c07 }}},\r
+ { 0x2c38, {1, {0x2c08 }}},\r
+ { 0x2c39, {1, {0x2c09 }}},\r
+ { 0x2c3a, {1, {0x2c0a }}},\r
+ { 0x2c3b, {1, {0x2c0b }}},\r
+ { 0x2c3c, {1, {0x2c0c }}},\r
+ { 0x2c3d, {1, {0x2c0d }}},\r
+ { 0x2c3e, {1, {0x2c0e }}},\r
+ { 0x2c3f, {1, {0x2c0f }}},\r
+ { 0x2c40, {1, {0x2c10 }}},\r
+ { 0x2c41, {1, {0x2c11 }}},\r
+ { 0x2c42, {1, {0x2c12 }}},\r
+ { 0x2c43, {1, {0x2c13 }}},\r
+ { 0x2c44, {1, {0x2c14 }}},\r
+ { 0x2c45, {1, {0x2c15 }}},\r
+ { 0x2c46, {1, {0x2c16 }}},\r
+ { 0x2c47, {1, {0x2c17 }}},\r
+ { 0x2c48, {1, {0x2c18 }}},\r
+ { 0x2c49, {1, {0x2c19 }}},\r
+ { 0x2c4a, {1, {0x2c1a }}},\r
+ { 0x2c4b, {1, {0x2c1b }}},\r
+ { 0x2c4c, {1, {0x2c1c }}},\r
+ { 0x2c4d, {1, {0x2c1d }}},\r
+ { 0x2c4e, {1, {0x2c1e }}},\r
+ { 0x2c4f, {1, {0x2c1f }}},\r
+ { 0x2c50, {1, {0x2c20 }}},\r
+ { 0x2c51, {1, {0x2c21 }}},\r
+ { 0x2c52, {1, {0x2c22 }}},\r
+ { 0x2c53, {1, {0x2c23 }}},\r
+ { 0x2c54, {1, {0x2c24 }}},\r
+ { 0x2c55, {1, {0x2c25 }}},\r
+ { 0x2c56, {1, {0x2c26 }}},\r
+ { 0x2c57, {1, {0x2c27 }}},\r
+ { 0x2c58, {1, {0x2c28 }}},\r
+ { 0x2c59, {1, {0x2c29 }}},\r
+ { 0x2c5a, {1, {0x2c2a }}},\r
+ { 0x2c5b, {1, {0x2c2b }}},\r
+ { 0x2c5c, {1, {0x2c2c }}},\r
+ { 0x2c5d, {1, {0x2c2d }}},\r
+ { 0x2c5e, {1, {0x2c2e }}},\r
+ { 0x2c81, {1, {0x2c80 }}},\r
+ { 0x2c83, {1, {0x2c82 }}},\r
+ { 0x2c85, {1, {0x2c84 }}},\r
+ { 0x2c87, {1, {0x2c86 }}},\r
+ { 0x2c89, {1, {0x2c88 }}},\r
+ { 0x2c8b, {1, {0x2c8a }}},\r
+ { 0x2c8d, {1, {0x2c8c }}},\r
+ { 0x2c8f, {1, {0x2c8e }}},\r
+ { 0x2c91, {1, {0x2c90 }}},\r
+ { 0x2c93, {1, {0x2c92 }}},\r
+ { 0x2c95, {1, {0x2c94 }}},\r
+ { 0x2c97, {1, {0x2c96 }}},\r
+ { 0x2c99, {1, {0x2c98 }}},\r
+ { 0x2c9b, {1, {0x2c9a }}},\r
+ { 0x2c9d, {1, {0x2c9c }}},\r
+ { 0x2c9f, {1, {0x2c9e }}},\r
+ { 0x2ca1, {1, {0x2ca0 }}},\r
+ { 0x2ca3, {1, {0x2ca2 }}},\r
+ { 0x2ca5, {1, {0x2ca4 }}},\r
+ { 0x2ca7, {1, {0x2ca6 }}},\r
+ { 0x2ca9, {1, {0x2ca8 }}},\r
+ { 0x2cab, {1, {0x2caa }}},\r
+ { 0x2cad, {1, {0x2cac }}},\r
+ { 0x2caf, {1, {0x2cae }}},\r
+ { 0x2cb1, {1, {0x2cb0 }}},\r
+ { 0x2cb3, {1, {0x2cb2 }}},\r
+ { 0x2cb5, {1, {0x2cb4 }}},\r
+ { 0x2cb7, {1, {0x2cb6 }}},\r
+ { 0x2cb9, {1, {0x2cb8 }}},\r
+ { 0x2cbb, {1, {0x2cba }}},\r
+ { 0x2cbd, {1, {0x2cbc }}},\r
+ { 0x2cbf, {1, {0x2cbe }}},\r
+ { 0x2cc1, {1, {0x2cc0 }}},\r
+ { 0x2cc3, {1, {0x2cc2 }}},\r
+ { 0x2cc5, {1, {0x2cc4 }}},\r
+ { 0x2cc7, {1, {0x2cc6 }}},\r
+ { 0x2cc9, {1, {0x2cc8 }}},\r
+ { 0x2ccb, {1, {0x2cca }}},\r
+ { 0x2ccd, {1, {0x2ccc }}},\r
+ { 0x2ccf, {1, {0x2cce }}},\r
+ { 0x2cd1, {1, {0x2cd0 }}},\r
+ { 0x2cd3, {1, {0x2cd2 }}},\r
+ { 0x2cd5, {1, {0x2cd4 }}},\r
+ { 0x2cd7, {1, {0x2cd6 }}},\r
+ { 0x2cd9, {1, {0x2cd8 }}},\r
+ { 0x2cdb, {1, {0x2cda }}},\r
+ { 0x2cdd, {1, {0x2cdc }}},\r
+ { 0x2cdf, {1, {0x2cde }}},\r
+ { 0x2ce1, {1, {0x2ce0 }}},\r
+ { 0x2ce3, {1, {0x2ce2 }}},\r
+ { 0x2d00, {1, {0x10a0 }}},\r
+ { 0x2d01, {1, {0x10a1 }}},\r
+ { 0x2d02, {1, {0x10a2 }}},\r
+ { 0x2d03, {1, {0x10a3 }}},\r
+ { 0x2d04, {1, {0x10a4 }}},\r
+ { 0x2d05, {1, {0x10a5 }}},\r
+ { 0x2d06, {1, {0x10a6 }}},\r
+ { 0x2d07, {1, {0x10a7 }}},\r
+ { 0x2d08, {1, {0x10a8 }}},\r
+ { 0x2d09, {1, {0x10a9 }}},\r
+ { 0x2d0a, {1, {0x10aa }}},\r
+ { 0x2d0b, {1, {0x10ab }}},\r
+ { 0x2d0c, {1, {0x10ac }}},\r
+ { 0x2d0d, {1, {0x10ad }}},\r
+ { 0x2d0e, {1, {0x10ae }}},\r
+ { 0x2d0f, {1, {0x10af }}},\r
+ { 0x2d10, {1, {0x10b0 }}},\r
+ { 0x2d11, {1, {0x10b1 }}},\r
+ { 0x2d12, {1, {0x10b2 }}},\r
+ { 0x2d13, {1, {0x10b3 }}},\r
+ { 0x2d14, {1, {0x10b4 }}},\r
+ { 0x2d15, {1, {0x10b5 }}},\r
+ { 0x2d16, {1, {0x10b6 }}},\r
+ { 0x2d17, {1, {0x10b7 }}},\r
+ { 0x2d18, {1, {0x10b8 }}},\r
+ { 0x2d19, {1, {0x10b9 }}},\r
+ { 0x2d1a, {1, {0x10ba }}},\r
+ { 0x2d1b, {1, {0x10bb }}},\r
+ { 0x2d1c, {1, {0x10bc }}},\r
+ { 0x2d1d, {1, {0x10bd }}},\r
+ { 0x2d1e, {1, {0x10be }}},\r
+ { 0x2d1f, {1, {0x10bf }}},\r
+ { 0x2d20, {1, {0x10c0 }}},\r
+ { 0x2d21, {1, {0x10c1 }}},\r
+ { 0x2d22, {1, {0x10c2 }}},\r
+ { 0x2d23, {1, {0x10c3 }}},\r
+ { 0x2d24, {1, {0x10c4 }}},\r
+ { 0x2d25, {1, {0x10c5 }}},\r
+ { 0xff41, {1, {0xff21 }}},\r
+ { 0xff42, {1, {0xff22 }}},\r
+ { 0xff43, {1, {0xff23 }}},\r
+ { 0xff44, {1, {0xff24 }}},\r
+ { 0xff45, {1, {0xff25 }}},\r
+ { 0xff46, {1, {0xff26 }}},\r
+ { 0xff47, {1, {0xff27 }}},\r
+ { 0xff48, {1, {0xff28 }}},\r
+ { 0xff49, {1, {0xff29 }}},\r
+ { 0xff4a, {1, {0xff2a }}},\r
+ { 0xff4b, {1, {0xff2b }}},\r
+ { 0xff4c, {1, {0xff2c }}},\r
+ { 0xff4d, {1, {0xff2d }}},\r
+ { 0xff4e, {1, {0xff2e }}},\r
+ { 0xff4f, {1, {0xff2f }}},\r
+ { 0xff50, {1, {0xff30 }}},\r
+ { 0xff51, {1, {0xff31 }}},\r
+ { 0xff52, {1, {0xff32 }}},\r
+ { 0xff53, {1, {0xff33 }}},\r
+ { 0xff54, {1, {0xff34 }}},\r
+ { 0xff55, {1, {0xff35 }}},\r
+ { 0xff56, {1, {0xff36 }}},\r
+ { 0xff57, {1, {0xff37 }}},\r
+ { 0xff58, {1, {0xff38 }}},\r
+ { 0xff59, {1, {0xff39 }}},\r
+ { 0xff5a, {1, {0xff3a }}},\r
+ { 0x10428, {1, {0x10400 }}},\r
+ { 0x10429, {1, {0x10401 }}},\r
+ { 0x1042a, {1, {0x10402 }}},\r
+ { 0x1042b, {1, {0x10403 }}},\r
+ { 0x1042c, {1, {0x10404 }}},\r
+ { 0x1042d, {1, {0x10405 }}},\r
+ { 0x1042e, {1, {0x10406 }}},\r
+ { 0x1042f, {1, {0x10407 }}},\r
+ { 0x10430, {1, {0x10408 }}},\r
+ { 0x10431, {1, {0x10409 }}},\r
+ { 0x10432, {1, {0x1040a }}},\r
+ { 0x10433, {1, {0x1040b }}},\r
+ { 0x10434, {1, {0x1040c }}},\r
+ { 0x10435, {1, {0x1040d }}},\r
+ { 0x10436, {1, {0x1040e }}},\r
+ { 0x10437, {1, {0x1040f }}},\r
+ { 0x10438, {1, {0x10410 }}},\r
+ { 0x10439, {1, {0x10411 }}},\r
+ { 0x1043a, {1, {0x10412 }}},\r
+ { 0x1043b, {1, {0x10413 }}},\r
+ { 0x1043c, {1, {0x10414 }}},\r
+ { 0x1043d, {1, {0x10415 }}},\r
+ { 0x1043e, {1, {0x10416 }}},\r
+ { 0x1043f, {1, {0x10417 }}},\r
+ { 0x10440, {1, {0x10418 }}},\r
+ { 0x10441, {1, {0x10419 }}},\r
+ { 0x10442, {1, {0x1041a }}},\r
+ { 0x10443, {1, {0x1041b }}},\r
+ { 0x10444, {1, {0x1041c }}},\r
+ { 0x10445, {1, {0x1041d }}},\r
+ { 0x10446, {1, {0x1041e }}},\r
+ { 0x10447, {1, {0x1041f }}},\r
+ { 0x10448, {1, {0x10420 }}},\r
+ { 0x10449, {1, {0x10421 }}},\r
+ { 0x1044a, {1, {0x10422 }}},\r
+ { 0x1044b, {1, {0x10423 }}},\r
+ { 0x1044c, {1, {0x10424 }}},\r
+ { 0x1044d, {1, {0x10425 }}},\r
+ { 0x1044e, {1, {0x10426 }}},\r
+ { 0x1044f, {1, {0x10427 }}}\r
+};\r
+\r
+static const CaseUnfold_11_Type CaseUnfold_11_Locale[] = {\r
+ { 0x0069, {1, {0x0049 }}}\r
+};\r
+\r
+static const CaseUnfold_12_Type CaseUnfold_12[] = {\r
+ { {0x0061, 0x02be}, {1, {0x1e9a }}},\r
+ { {0x0066, 0x0066}, {1, {0xfb00 }}},\r
+ { {0x0066, 0x0069}, {1, {0xfb01 }}},\r
+ { {0x0066, 0x006c}, {1, {0xfb02 }}},\r
+ { {0x0068, 0x0331}, {1, {0x1e96 }}},\r
+ { {0x006a, 0x030c}, {1, {0x01f0 }}},\r
+ { {0x0073, 0x0073}, {1, {0x00df }}},\r
+ { {0x0073, 0x0074}, {2, {0xfb05, 0xfb06 }}},\r
+ { {0x0074, 0x0308}, {1, {0x1e97 }}},\r
+ { {0x0077, 0x030a}, {1, {0x1e98 }}},\r
+ { {0x0079, 0x030a}, {1, {0x1e99 }}},\r
+ { {0x02bc, 0x006e}, {1, {0x0149 }}},\r
+ { {0x03ac, 0x03b9}, {1, {0x1fb4 }}},\r
+ { {0x03ae, 0x03b9}, {1, {0x1fc4 }}},\r
+ { {0x03b1, 0x0342}, {1, {0x1fb6 }}},\r
+ { {0x03b1, 0x03b9}, {2, {0x1fb3, 0x1fbc }}},\r
+ { {0x03b7, 0x0342}, {1, {0x1fc6 }}},\r
+ { {0x03b7, 0x03b9}, {2, {0x1fc3, 0x1fcc }}},\r
+ { {0x03b9, 0x0342}, {1, {0x1fd6 }}},\r
+ { {0x03c1, 0x0313}, {1, {0x1fe4 }}},\r
+ { {0x03c5, 0x0313}, {1, {0x1f50 }}},\r
+ { {0x03c5, 0x0342}, {1, {0x1fe6 }}},\r
+ { {0x03c9, 0x0342}, {1, {0x1ff6 }}},\r
+ { {0x03c9, 0x03b9}, {2, {0x1ff3, 0x1ffc }}},\r
+ { {0x03ce, 0x03b9}, {1, {0x1ff4 }}},\r
+ { {0x0565, 0x0582}, {1, {0x0587 }}},\r
+ { {0x0574, 0x0565}, {1, {0xfb14 }}},\r
+ { {0x0574, 0x056b}, {1, {0xfb15 }}},\r
+ { {0x0574, 0x056d}, {1, {0xfb17 }}},\r
+ { {0x0574, 0x0576}, {1, {0xfb13 }}},\r
+ { {0x057e, 0x0576}, {1, {0xfb16 }}},\r
+ { {0x1f00, 0x03b9}, {2, {0x1f88, 0x1f80 }}},\r
+ { {0x1f01, 0x03b9}, {2, {0x1f81, 0x1f89 }}},\r
+ { {0x1f02, 0x03b9}, {2, {0x1f82, 0x1f8a }}},\r
+ { {0x1f03, 0x03b9}, {2, {0x1f83, 0x1f8b }}},\r
+ { {0x1f04, 0x03b9}, {2, {0x1f84, 0x1f8c }}},\r
+ { {0x1f05, 0x03b9}, {2, {0x1f85, 0x1f8d }}},\r
+ { {0x1f06, 0x03b9}, {2, {0x1f86, 0x1f8e }}},\r
+ { {0x1f07, 0x03b9}, {2, {0x1f87, 0x1f8f }}},\r
+ { {0x1f20, 0x03b9}, {2, {0x1f90, 0x1f98 }}},\r
+ { {0x1f21, 0x03b9}, {2, {0x1f91, 0x1f99 }}},\r
+ { {0x1f22, 0x03b9}, {2, {0x1f92, 0x1f9a }}},\r
+ { {0x1f23, 0x03b9}, {2, {0x1f93, 0x1f9b }}},\r
+ { {0x1f24, 0x03b9}, {2, {0x1f94, 0x1f9c }}},\r
+ { {0x1f25, 0x03b9}, {2, {0x1f95, 0x1f9d }}},\r
+ { {0x1f26, 0x03b9}, {2, {0x1f96, 0x1f9e }}},\r
+ { {0x1f27, 0x03b9}, {2, {0x1f97, 0x1f9f }}},\r
+ { {0x1f60, 0x03b9}, {2, {0x1fa0, 0x1fa8 }}},\r
+ { {0x1f61, 0x03b9}, {2, {0x1fa1, 0x1fa9 }}},\r
+ { {0x1f62, 0x03b9}, {2, {0x1fa2, 0x1faa }}},\r
+ { {0x1f63, 0x03b9}, {2, {0x1fa3, 0x1fab }}},\r
+ { {0x1f64, 0x03b9}, {2, {0x1fa4, 0x1fac }}},\r
+ { {0x1f65, 0x03b9}, {2, {0x1fa5, 0x1fad }}},\r
+ { {0x1f66, 0x03b9}, {2, {0x1fa6, 0x1fae }}},\r
+ { {0x1f67, 0x03b9}, {2, {0x1fa7, 0x1faf }}},\r
+ { {0x1f70, 0x03b9}, {1, {0x1fb2 }}},\r
+ { {0x1f74, 0x03b9}, {1, {0x1fc2 }}},\r
+ { {0x1f7c, 0x03b9}, {1, {0x1ff2 }}}\r
+};\r
+\r
+static const CaseUnfold_12_Type CaseUnfold_12_Locale[] = {\r
+ { {0x0069, 0x0307}, {1, {0x0130 }}}\r
+};\r
+\r
+static const CaseUnfold_13_Type CaseUnfold_13[] = {\r
+ { {0x0066, 0x0066, 0x0069}, {1, {0xfb03 }}},\r
+ { {0x0066, 0x0066, 0x006c}, {1, {0xfb04 }}},\r
+ { {0x03b1, 0x0342, 0x03b9}, {1, {0x1fb7 }}},\r
+ { {0x03b7, 0x0342, 0x03b9}, {1, {0x1fc7 }}},\r
+ { {0x03b9, 0x0308, 0x0300}, {1, {0x1fd2 }}},\r
+ { {0x03b9, 0x0308, 0x0301}, {2, {0x0390, 0x1fd3 }}},\r
+ { {0x03b9, 0x0308, 0x0342}, {1, {0x1fd7 }}},\r
+ { {0x03c5, 0x0308, 0x0300}, {1, {0x1fe2 }}},\r
+ { {0x03c5, 0x0308, 0x0301}, {2, {0x03b0, 0x1fe3 }}},\r
+ { {0x03c5, 0x0308, 0x0342}, {1, {0x1fe7 }}},\r
+ { {0x03c5, 0x0313, 0x0300}, {1, {0x1f52 }}},\r
+ { {0x03c5, 0x0313, 0x0301}, {1, {0x1f54 }}},\r
+ { {0x03c5, 0x0313, 0x0342}, {1, {0x1f56 }}},\r
+ { {0x03c9, 0x0342, 0x03b9}, {1, {0x1ff7 }}}\r
+};\r
+\r
+\r
+static PosixBracketEntryType HashEntryData[] = {\r
+ { (UChar* )"NEWLINE", 0, 7 },\r
+ { (UChar* )"Alpha", 1, 5 },\r
+ { (UChar* )"Blank", 2, 5 },\r
+ { (UChar* )"Cntrl", 3, 5 },\r
+ { (UChar* )"Digit", 4, 5 },\r
+ { (UChar* )"Graph", 5, 5 },\r
+ { (UChar* )"Lower", 6, 5 },\r
+ { (UChar* )"Print", 7, 5 },\r
+ { (UChar* )"Punct", 8, 5 },\r
+ { (UChar* )"Space", 9, 5 },\r
+ { (UChar* )"Upper", 10, 5 },\r
+ { (UChar* )"XDigit", 11, 6 },\r
+ { (UChar* )"Word", 12, 4 },\r
+ { (UChar* )"Alnum", 13, 5 },\r
+ { (UChar* )"ASCII", 14, 5 },\r
+\r
+#ifdef USE_UNICODE_PROPERTIES\r
+ { (UChar* )"Any", 15, 3 },\r
+ { (UChar* )"Assigned", 16, 8 },\r
+ { (UChar* )"C", 17, 1 },\r
+ { (UChar* )"Cc", 18, 2 },\r
+ { (UChar* )"Cf", 19, 2 },\r
+ { (UChar* )"Cn", 20, 2 },\r
+ { (UChar* )"Co", 21, 2 },\r
+ { (UChar* )"Cs", 22, 2 },\r
+ { (UChar* )"L", 23, 1 },\r
+ { (UChar* )"Ll", 24, 2 },\r
+ { (UChar* )"Lm", 25, 2 },\r
+ { (UChar* )"Lo", 26, 2 },\r
+ { (UChar* )"Lt", 27, 2 },\r
+ { (UChar* )"Lu", 28, 2 },\r
+ { (UChar* )"M", 29, 1 },\r
+ { (UChar* )"Mc", 30, 2 },\r
+ { (UChar* )"Me", 31, 2 },\r
+ { (UChar* )"Mn", 32, 2 },\r
+ { (UChar* )"N", 33, 1 },\r
+ { (UChar* )"Nd", 34, 2 },\r
+ { (UChar* )"Nl", 35, 2 },\r
+ { (UChar* )"No", 36, 2 },\r
+ { (UChar* )"P", 37, 1 },\r
+ { (UChar* )"Pc", 38, 2 },\r
+ { (UChar* )"Pd", 39, 2 },\r
+ { (UChar* )"Pe", 40, 2 },\r
+ { (UChar* )"Pf", 41, 2 },\r
+ { (UChar* )"Pi", 42, 2 },\r
+ { (UChar* )"Po", 43, 2 },\r
+ { (UChar* )"Ps", 44, 2 },\r
+ { (UChar* )"S", 45, 1 },\r
+ { (UChar* )"Sc", 46, 2 },\r
+ { (UChar* )"Sk", 47, 2 },\r
+ { (UChar* )"Sm", 48, 2 },\r
+ { (UChar* )"So", 49, 2 },\r
+ { (UChar* )"Z", 50, 1 },\r
+ { (UChar* )"Zl", 51, 2 },\r
+ { (UChar* )"Zp", 52, 2 },\r
+ { (UChar* )"Zs", 53, 2 },\r
+ { (UChar* )"Arabic", 54, 6 },\r
+ { (UChar* )"Armenian", 55, 8 },\r
+ { (UChar* )"Bengali", 56, 7 },\r
+ { (UChar* )"Bopomofo", 57, 8 },\r
+ { (UChar* )"Braille", 58, 7 },\r
+ { (UChar* )"Buginese", 59, 8 },\r
+ { (UChar* )"Buhid", 60, 5 },\r
+ { (UChar* )"Canadian_Aboriginal", 61, 19 },\r
+ { (UChar* )"Cherokee", 62, 8 },\r
+ { (UChar* )"Common", 63, 6 },\r
+ { (UChar* )"Coptic", 64, 6 },\r
+ { (UChar* )"Cypriot", 65, 7 },\r
+ { (UChar* )"Cyrillic", 66, 8 },\r
+ { (UChar* )"Deseret", 67, 7 },\r
+ { (UChar* )"Devanagari", 68, 10 },\r
+ { (UChar* )"Ethiopic", 69, 8 },\r
+ { (UChar* )"Georgian", 70, 8 },\r
+ { (UChar* )"Glagolitic", 71, 10 },\r
+ { (UChar* )"Gothic", 72, 6 },\r
+ { (UChar* )"Greek", 73, 5 },\r
+ { (UChar* )"Gujarati", 74, 8 },\r
+ { (UChar* )"Gurmukhi", 75, 8 },\r
+ { (UChar* )"Han", 76, 3 },\r
+ { (UChar* )"Hangul", 77, 6 },\r
+ { (UChar* )"Hanunoo", 78, 7 },\r
+ { (UChar* )"Hebrew", 79, 6 },\r
+ { (UChar* )"Hiragana", 80, 8 },\r
+ { (UChar* )"Inherited", 81, 9 },\r
+ { (UChar* )"Kannada", 82, 7 },\r
+ { (UChar* )"Katakana", 83, 8 },\r
+ { (UChar* )"Kharoshthi", 84, 10 },\r
+ { (UChar* )"Khmer", 85, 5 },\r
+ { (UChar* )"Lao", 86, 3 },\r
+ { (UChar* )"Latin", 87, 5 },\r
+ { (UChar* )"Limbu", 88, 5 },\r
+ { (UChar* )"Linear_B", 89, 8 },\r
+ { (UChar* )"Malayalam", 90, 9 },\r
+ { (UChar* )"Mongolian", 91, 9 },\r
+ { (UChar* )"Myanmar", 92, 7 },\r
+ { (UChar* )"New_Tai_Lue", 93, 11 },\r
+ { (UChar* )"Ogham", 94, 5 },\r
+ { (UChar* )"Old_Italic", 95, 10 },\r
+ { (UChar* )"Old_Persian", 96, 11 },\r
+ { (UChar* )"Oriya", 97, 5 },\r
+ { (UChar* )"Osmanya", 98, 7 },\r
+ { (UChar* )"Runic", 99, 5 },\r
+ { (UChar* )"Shavian", 100, 7 },\r
+ { (UChar* )"Sinhala", 101, 7 },\r
+ { (UChar* )"Syloti_Nagri", 102, 12 },\r
+ { (UChar* )"Syriac", 103, 6 },\r
+ { (UChar* )"Tagalog", 104, 7 },\r
+ { (UChar* )"Tagbanwa", 105, 8 },\r
+ { (UChar* )"Tai_Le", 106, 6 },\r
+ { (UChar* )"Tamil", 107, 5 },\r
+ { (UChar* )"Telugu", 108, 6 },\r
+ { (UChar* )"Thaana", 109, 6 },\r
+ { (UChar* )"Thai", 110, 4 },\r
+ { (UChar* )"Tibetan", 111, 7 },\r
+ { (UChar* )"Tifinagh", 112, 8 },\r
+ { (UChar* )"Ugaritic", 113, 8 },\r
+ { (UChar* )"Yi", 114, 2 },\r
+#endif /* USE_UNICODE_PROPERTIES */\r
+ { (UChar* )NULL, -1, 0 }\r
+};\r
+\r
+#ifdef USE_UNICODE_PROPERTIES\r
+#define CODE_RANGES_NUM 115\r
+#else\r
+#define CODE_RANGES_NUM 15\r
+#endif\r
+\r
+static const OnigCodePoint* CodeRanges[CODE_RANGES_NUM];\r
+static int CodeRangeTableInited = 0;\r
+\r
+static void init_code_range_array(void) {\r
+ THREAD_ATOMIC_START;\r
+\r
+ CodeRanges[0] = CR_NEWLINE;\r
+ CodeRanges[1] = CR_Alpha;\r
+ CodeRanges[2] = CR_Blank;\r
+ CodeRanges[3] = CR_Cntrl;\r
+ CodeRanges[4] = CR_Digit;\r
+ CodeRanges[5] = CR_Graph;\r
+ CodeRanges[6] = CR_Lower;\r
+ CodeRanges[7] = CR_Print;\r
+ CodeRanges[8] = CR_Punct;\r
+ CodeRanges[9] = CR_Space;\r
+ CodeRanges[10] = CR_Upper;\r
+ CodeRanges[11] = CR_XDigit;\r
+ CodeRanges[12] = CR_Word;\r
+ CodeRanges[13] = CR_Alnum;\r
+ CodeRanges[14] = CR_ASCII;\r
+\r
+#ifdef USE_UNICODE_PROPERTIES\r
+ CodeRanges[15] = CR_Any;\r
+ CodeRanges[16] = CR_Assigned;\r
+ CodeRanges[17] = CR_C;\r
+ CodeRanges[18] = CR_Cc;\r
+ CodeRanges[19] = CR_Cf;\r
+ CodeRanges[20] = CR_Cn;\r
+ CodeRanges[21] = CR_Co;\r
+ CodeRanges[22] = CR_Cs;\r
+ CodeRanges[23] = CR_L;\r
+ CodeRanges[24] = CR_Ll;\r
+ CodeRanges[25] = CR_Lm;\r
+ CodeRanges[26] = CR_Lo;\r
+ CodeRanges[27] = CR_Lt;\r
+ CodeRanges[28] = CR_Lu;\r
+ CodeRanges[29] = CR_M;\r
+ CodeRanges[30] = CR_Mc;\r
+ CodeRanges[31] = CR_Me;\r
+ CodeRanges[32] = CR_Mn;\r
+ CodeRanges[33] = CR_N;\r
+ CodeRanges[34] = CR_Nd;\r
+ CodeRanges[35] = CR_Nl;\r
+ CodeRanges[36] = CR_No;\r
+ CodeRanges[37] = CR_P;\r
+ CodeRanges[38] = CR_Pc;\r
+ CodeRanges[39] = CR_Pd;\r
+ CodeRanges[40] = CR_Pe;\r
+ CodeRanges[41] = CR_Pf;\r
+ CodeRanges[42] = CR_Pi;\r
+ CodeRanges[43] = CR_Po;\r
+ CodeRanges[44] = CR_Ps;\r
+ CodeRanges[45] = CR_S;\r
+ CodeRanges[46] = CR_Sc;\r
+ CodeRanges[47] = CR_Sk;\r
+ CodeRanges[48] = CR_Sm;\r
+ CodeRanges[49] = CR_So;\r
+ CodeRanges[50] = CR_Z;\r
+ CodeRanges[51] = CR_Zl;\r
+ CodeRanges[52] = CR_Zp;\r
+ CodeRanges[53] = CR_Zs;\r
+ CodeRanges[54] = CR_Arabic;\r
+ CodeRanges[55] = CR_Armenian;\r
+ CodeRanges[56] = CR_Bengali;\r
+ CodeRanges[57] = CR_Bopomofo;\r
+ CodeRanges[58] = CR_Braille;\r
+ CodeRanges[59] = CR_Buginese;\r
+ CodeRanges[60] = CR_Buhid;\r
+ CodeRanges[61] = CR_Canadian_Aboriginal;\r
+ CodeRanges[62] = CR_Cherokee;\r
+ CodeRanges[63] = CR_Common;\r
+ CodeRanges[64] = CR_Coptic;\r
+ CodeRanges[65] = CR_Cypriot;\r
+ CodeRanges[66] = CR_Cyrillic;\r
+ CodeRanges[67] = CR_Deseret;\r
+ CodeRanges[68] = CR_Devanagari;\r
+ CodeRanges[69] = CR_Ethiopic;\r
+ CodeRanges[70] = CR_Georgian;\r
+ CodeRanges[71] = CR_Glagolitic;\r
+ CodeRanges[72] = CR_Gothic;\r
+ CodeRanges[73] = CR_Greek;\r
+ CodeRanges[74] = CR_Gujarati;\r
+ CodeRanges[75] = CR_Gurmukhi;\r
+ CodeRanges[76] = CR_Han;\r
+ CodeRanges[77] = CR_Hangul;\r
+ CodeRanges[78] = CR_Hanunoo;\r
+ CodeRanges[79] = CR_Hebrew;\r
+ CodeRanges[80] = CR_Hiragana;\r
+ CodeRanges[81] = CR_Inherited;\r
+ CodeRanges[82] = CR_Kannada;\r
+ CodeRanges[83] = CR_Katakana;\r
+ CodeRanges[84] = CR_Kharoshthi;\r
+ CodeRanges[85] = CR_Khmer;\r
+ CodeRanges[86] = CR_Lao;\r
+ CodeRanges[87] = CR_Latin;\r
+ CodeRanges[88] = CR_Limbu;\r
+ CodeRanges[89] = CR_Linear_B;\r
+ CodeRanges[90] = CR_Malayalam;\r
+ CodeRanges[91] = CR_Mongolian;\r
+ CodeRanges[92] = CR_Myanmar;\r
+ CodeRanges[93] = CR_New_Tai_Lue;\r
+ CodeRanges[94] = CR_Ogham;\r
+ CodeRanges[95] = CR_Old_Italic;\r
+ CodeRanges[96] = CR_Old_Persian;\r
+ CodeRanges[97] = CR_Oriya;\r
+ CodeRanges[98] = CR_Osmanya;\r
+ CodeRanges[99] = CR_Runic;\r
+ CodeRanges[100] = CR_Shavian;\r
+ CodeRanges[101] = CR_Sinhala;\r
+ CodeRanges[102] = CR_Syloti_Nagri;\r
+ CodeRanges[103] = CR_Syriac;\r
+ CodeRanges[104] = CR_Tagalog;\r
+ CodeRanges[105] = CR_Tagbanwa;\r
+ CodeRanges[106] = CR_Tai_Le;\r
+ CodeRanges[107] = CR_Tamil;\r
+ CodeRanges[108] = CR_Telugu;\r
+ CodeRanges[109] = CR_Thaana;\r
+ CodeRanges[110] = CR_Thai;\r
+ CodeRanges[111] = CR_Tibetan;\r
+ CodeRanges[112] = CR_Tifinagh;\r
+ CodeRanges[113] = CR_Ugaritic;\r
+ CodeRanges[114] = CR_Yi;\r
+#endif /* USE_UNICODE_PROPERTIES */\r
+\r
+ CodeRangeTableInited = 1;\r
+ THREAD_ATOMIC_END;\r
+}\r
+\r
+extern int\r
+onigenc_unicode_is_code_ctype(OnigCodePoint code, unsigned int ctype)\r
+{\r
+ if (\r
+#ifdef USE_UNICODE_PROPERTIES\r
+ ctype <= ONIGENC_MAX_STD_CTYPE &&\r
+#endif\r
+ code < 256) {\r
+ return ONIGENC_IS_UNICODE_ISO_8859_1_CTYPE(code, ctype);\r
+ }\r
+\r
+ if (ctype >= CODE_RANGES_NUM) {\r
+ return ONIGERR_TYPE_BUG;\r
+ }\r
+\r
+ if (CodeRangeTableInited == 0) init_code_range_array();\r
+\r
+ return onig_is_in_code_range((UChar* )CodeRanges[ctype], code);\r
+}\r
+\r
+\r
+extern int\r
+onigenc_unicode_ctype_code_range(int ctype, const OnigCodePoint* ranges[])\r
+{\r
+ if (ctype >= CODE_RANGES_NUM) {\r
+ return ONIGERR_TYPE_BUG;\r
+ }\r
+\r
+ if (CodeRangeTableInited == 0) init_code_range_array();\r
+\r
+ *ranges = CodeRanges[ctype];\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_utf16_32_get_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,\r
+ const OnigCodePoint* ranges[])\r
+{\r
+ *sb_out = 0x00;\r
+ return onigenc_unicode_ctype_code_range(ctype, ranges);\r
+}\r
+\r
+#include "st.h"\r
+\r
+#define PROPERTY_NAME_MAX_SIZE 20\r
+\r
+static st_table* NameCtypeTable;\r
+static int NameTableInited = 0;\r
+\r
+static int init_name_ctype_table(void)\r
+{\r
+ PosixBracketEntryType *pb;\r
+\r
+ THREAD_ATOMIC_START;\r
+\r
+ NameCtypeTable = onig_st_init_strend_table_with_size(100);\r
+ if (ONIG_IS_NULL(NameCtypeTable)) return ONIGERR_MEMORY;\r
+\r
+ for (pb = HashEntryData; ONIG_IS_NOT_NULL(pb->name); pb++) {\r
+ onig_st_insert_strend(NameCtypeTable, pb->name, pb->name + pb->len,\r
+ (st_data_t )pb->ctype);\r
+ }\r
+\r
+ NameTableInited = 1;\r
+ THREAD_ATOMIC_END;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_unicode_property_name_to_ctype(OnigEncoding enc, UChar* name, UChar* end)\r
+{\r
+ int len;\r
+ hash_data_type ctype;\r
+ UChar buf[PROPERTY_NAME_MAX_SIZE];\r
+ UChar *p;\r
+ OnigCodePoint code;\r
+\r
+ p = name;\r
+ len = 0;\r
+ while (p < end) {\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ if (code >= 0x80)\r
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\r
+\r
+ buf[len++] = (UChar )code;\r
+ if (len >= PROPERTY_NAME_MAX_SIZE)\r
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\r
+\r
+ p += enclen(enc, p);\r
+ }\r
+\r
+ buf[len] = 0;\r
+\r
+ if (NameTableInited == 0) init_name_ctype_table();\r
+\r
+ if (onig_st_lookup_strend(NameCtypeTable, buf, buf + len, &ctype) == 0) {\r
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\r
+ }\r
+\r
+ return (int )ctype;\r
+}\r
+\r
+\r
+static int\r
+code2_cmp(OnigCodePoint* x, OnigCodePoint* y)\r
+{\r
+ if (x[0] == y[0] && x[1] == y[1]) return 0;\r
+ return 1;\r
+}\r
+\r
+static int\r
+code2_hash(OnigCodePoint* x)\r
+{\r
+ return (int )(x[0] + x[1]);\r
+}\r
+\r
+static struct st_hash_type type_code2_hash = {\r
+ code2_cmp,\r
+ code2_hash,\r
+};\r
+\r
+static int\r
+code3_cmp(OnigCodePoint* x, OnigCodePoint* y)\r
+{\r
+ if (x[0] == y[0] && x[1] == y[1] && x[2] == y[2]) return 0;\r
+ return 1;\r
+}\r
+\r
+static int\r
+code3_hash(OnigCodePoint* x)\r
+{\r
+ return (int )(x[0] + x[1] + x[2]);\r
+}\r
+\r
+static struct st_hash_type type_code3_hash = {\r
+ code3_cmp,\r
+ code3_hash,\r
+};\r
+\r
+\r
+static st_table* FoldTable; /* fold-1, fold-2, fold-3 */\r
+static st_table* Unfold1Table;\r
+static st_table* Unfold2Table;\r
+static st_table* Unfold3Table;\r
+static int CaseFoldInited = 0;\r
+\r
+\r
+extern void onigenc_end_unicode(void)\r
+{\r
+ THREAD_ATOMIC_START;\r
+\r
+ if (FoldTable != 0) st_free_table(FoldTable);\r
+ if (Unfold1Table != 0) st_free_table(Unfold1Table);\r
+ if (Unfold2Table != 0) st_free_table(Unfold2Table);\r
+ if (Unfold3Table != 0) st_free_table(Unfold3Table);\r
+\r
+ CaseFoldInited = 0;\r
+\r
+ THREAD_ATOMIC_END;\r
+}\r
+\r
+static int init_case_fold_table(void)\r
+{\r
+ const CaseFold_11_Type *p;\r
+ const CaseUnfold_11_Type *p1;\r
+ const CaseUnfold_12_Type *p2;\r
+ const CaseUnfold_13_Type *p3;\r
+ int i;\r
+\r
+ THREAD_ATOMIC_START;\r
+\r
+ FoldTable = st_init_numtable_with_size(1200);\r
+ if (ONIG_IS_NULL(FoldTable)) return ONIGERR_MEMORY;\r
+ for (i = 0; i < (int )(sizeof(CaseFold)/sizeof(CaseFold_11_Type)); i++) {\r
+ p = &CaseFold[i];\r
+ st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));\r
+ }\r
+ for (i = 0; i < (int )(sizeof(CaseFold_Locale)/sizeof(CaseFold_11_Type));\r
+ i++) {\r
+ p = &CaseFold_Locale[i];\r
+ st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));\r
+ }\r
+\r
+ Unfold1Table = st_init_numtable_with_size(1000);\r
+ if (ONIG_IS_NULL(Unfold1Table)) return ONIGERR_MEMORY;\r
+\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_11)/sizeof(CaseUnfold_11_Type));\r
+ i++) {\r
+ p1 = &CaseUnfold_11[i];\r
+ st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));\r
+ }\r
+ for (i = 0;\r
+ i < (int )(sizeof(CaseUnfold_11_Locale)/sizeof(CaseUnfold_11_Type));\r
+ i++) {\r
+ p1 = &CaseUnfold_11_Locale[i];\r
+ st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));\r
+ }\r
+\r
+ Unfold2Table = st_init_table_with_size(&type_code2_hash, 200);\r
+ if (ONIG_IS_NULL(Unfold2Table)) return ONIGERR_MEMORY;\r
+\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_12)/sizeof(CaseUnfold_12_Type));\r
+ i++) {\r
+ p2 = &CaseUnfold_12[i];\r
+ st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));\r
+ }\r
+ for (i = 0;\r
+ i < (int )(sizeof(CaseUnfold_12_Locale)/sizeof(CaseUnfold_12_Type));\r
+ i++) {\r
+ p2 = &CaseUnfold_12_Locale[i];\r
+ st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));\r
+ }\r
+\r
+ Unfold3Table = st_init_table_with_size(&type_code3_hash, 30);\r
+ if (ONIG_IS_NULL(Unfold3Table)) return ONIGERR_MEMORY;\r
+\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_13)/sizeof(CaseUnfold_13_Type));\r
+ i++) {\r
+ p3 = &CaseUnfold_13[i];\r
+ st_add_direct(Unfold3Table, (st_data_t )p3->from, (st_data_t )(&p3->to));\r
+ }\r
+\r
+\r
+ onig_add_end_call(onigenc_end_unicode);\r
+\r
+ CaseFoldInited = 1;\r
+ THREAD_ATOMIC_END;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_unicode_mbc_case_fold(OnigEncoding enc,\r
+ OnigCaseFoldType flag ARG_UNUSED, const UChar** pp, const UChar* end,\r
+ UChar* fold)\r
+{\r
+ CodePointList3 *to;\r
+ OnigCodePoint code;\r
+ int i, len, rlen;\r
+ const UChar *p = *pp;\r
+\r
+ if (CaseFoldInited == 0) init_case_fold_table();\r
+\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ len = enclen(enc, p);\r
+ *pp += len;\r
+\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\r
+ if (code == 0x0049) {\r
+ return ONIGENC_CODE_TO_MBC(enc, 0x0131, fold);\r
+ }\r
+ else if (code == 0x0130) {\r
+ return ONIGENC_CODE_TO_MBC(enc, 0x0069, fold);\r
+ }\r
+ }\r
+#endif\r
+\r
+ if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {\r
+ if (to->n == 1) {\r
+ return ONIGENC_CODE_TO_MBC(enc, to->code[0], fold); \r
+ }\r
+#if 0\r
+ /* NO NEEDS TO CHECK */\r
+ else if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\r
+#else\r
+ else {\r
+#endif\r
+ rlen = 0;\r
+ for (i = 0; i < to->n; i++) {\r
+ len = ONIGENC_CODE_TO_MBC(enc, to->code[i], fold);\r
+ fold += len;\r
+ rlen += len;\r
+ }\r
+ return rlen;\r
+ }\r
+ }\r
+\r
+ for (i = 0; i < len; i++) {\r
+ *fold++ = *p++;\r
+ }\r
+ return len;\r
+}\r
+\r
+extern int\r
+onigenc_unicode_apply_all_case_fold(OnigCaseFoldType flag,\r
+ OnigApplyAllCaseFoldFunc f, void* arg)\r
+{\r
+ const CaseUnfold_11_Type* p11;\r
+ OnigCodePoint code;\r
+ int i, j, k, r;\r
+\r
+ /* if (CaseFoldInited == 0) init_case_fold_table(); */\r
+\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_11)/sizeof(CaseUnfold_11_Type));\r
+ i++) {\r
+ p11 = &CaseUnfold_11[i];\r
+ for (j = 0; j < p11->to.n; j++) {\r
+ code = p11->from;\r
+ r = (*f)(p11->to.code[j], &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ code = p11->to.code[j];\r
+ r = (*f)(p11->from, &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ for (k = 0; k < j; k++) {\r
+ r = (*f)(p11->to.code[j], (OnigCodePoint* )(&p11->to.code[k]), 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ r = (*f)(p11->to.code[k], (OnigCodePoint* )(&p11->to.code[j]), 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\r
+ code = 0x0131;\r
+ r = (*f)(0x0049, &code, 1, arg);\r
+ if (r != 0) return r;\r
+ code = 0x0049;\r
+ r = (*f)(0x0131, &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ code = 0x0130;\r
+ r = (*f)(0x0069, &code, 1, arg);\r
+ if (r != 0) return r;\r
+ code = 0x0069;\r
+ r = (*f)(0x0130, &code, 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ else {\r
+#endif\r
+ for (i = 0;\r
+ i < (int )(sizeof(CaseUnfold_11_Locale)/sizeof(CaseUnfold_11_Type));\r
+ i++) {\r
+ p11 = &CaseUnfold_11_Locale[i];\r
+ for (j = 0; j < p11->to.n; j++) {\r
+ code = p11->from;\r
+ r = (*f)(p11->to.code[j], &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ code = p11->to.code[j];\r
+ r = (*f)(p11->from, &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ for (k = 0; k < j; k++) {\r
+ r = (*f)(p11->to.code[j], (OnigCodePoint* )(&p11->to.code[k]),\r
+ 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ r = (*f)(p11->to.code[k], (OnigCodePoint* )(&p11->to.code[j]),\r
+ 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ }\r
+#endif\r
+\r
+ if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_12)/sizeof(CaseUnfold_12_Type));\r
+ i++) {\r
+ for (j = 0; j < CaseUnfold_12[i].to.n; j++) {\r
+ r = (*f)(CaseUnfold_12[i].to.code[j],\r
+ (OnigCodePoint* )CaseUnfold_12[i].from, 2, arg);\r
+ if (r != 0) return r; \r
+\r
+ for (k = 0; k < CaseUnfold_12[i].to.n; k++) {\r
+ if (k == j) continue;\r
+\r
+ r = (*f)(CaseUnfold_12[i].to.code[j],\r
+ (OnigCodePoint* )(&CaseUnfold_12[i].to.code[k]), 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) == 0) {\r
+#endif\r
+ for (i = 0;\r
+ i < (int )(sizeof(CaseUnfold_12_Locale)/sizeof(CaseUnfold_12_Type));\r
+ i++) {\r
+ for (j = 0; j < CaseUnfold_12_Locale[i].to.n; j++) {\r
+ r = (*f)(CaseUnfold_12_Locale[i].to.code[j],\r
+ (OnigCodePoint* )CaseUnfold_12_Locale[i].from, 2, arg);\r
+ if (r != 0) return r; \r
+\r
+ for (k = 0; k < CaseUnfold_12_Locale[i].to.n; k++) {\r
+ if (k == j) continue;\r
+\r
+ r = (*f)(CaseUnfold_12_Locale[i].to.code[j],\r
+ (OnigCodePoint* )(&CaseUnfold_12_Locale[i].to.code[k]),\r
+ 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ }\r
+#endif\r
+\r
+ for (i = 0; i < (int )(sizeof(CaseUnfold_13)/sizeof(CaseUnfold_13_Type));\r
+ i++) {\r
+ for (j = 0; j < CaseUnfold_13[i].to.n; j++) {\r
+ r = (*f)(CaseUnfold_13[i].to.code[j],\r
+ (OnigCodePoint* )CaseUnfold_13[i].from, 3, arg);\r
+ if (r != 0) return r; \r
+\r
+ for (k = 0; k < CaseUnfold_13[i].to.n; k++) {\r
+ if (k == j) continue;\r
+\r
+ r = (*f)(CaseUnfold_13[i].to.code[j],\r
+ (OnigCodePoint* )(&CaseUnfold_13[i].to.code[k]), 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,\r
+ OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end,\r
+ OnigCaseFoldCodeItem items[])\r
+{\r
+ int n, i, j, k, len;\r
+ OnigCodePoint code, codes[3];\r
+ CodePointList3 *to, *z3;\r
+ CodePointList2 *z2;\r
+\r
+ if (CaseFoldInited == 0) init_case_fold_table();\r
+\r
+ n = 0;\r
+\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ len = enclen(enc, p);\r
+\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\r
+ if (code == 0x0049) {\r
+ items[0].byte_len = len;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = 0x0131;\r
+ return 1;\r
+ }\r
+ else if (code == 0x0130) {\r
+ items[0].byte_len = len;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = 0x0069;\r
+ return 1;\r
+ }\r
+ else if (code == 0x0131) {\r
+ items[0].byte_len = len;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = 0x0049;\r
+ return 1;\r
+ }\r
+ else if (code == 0x0069) {\r
+ items[0].byte_len = len;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = 0x0130;\r
+ return 1;\r
+ }\r
+ }\r
+#endif\r
+\r
+ if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {\r
+ if (to->n == 1) {\r
+ OnigCodePoint orig_code = code;\r
+\r
+ items[0].byte_len = len;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = to->code[0];\r
+ n++;\r
+\r
+ code = to->code[0];\r
+ if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {\r
+ for (i = 0; i < to->n; i++) {\r
+ if (to->code[i] != orig_code) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = to->code[i];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\r
+ OnigCodePoint cs[3][4];\r
+ int fn, ncs[3];\r
+\r
+ for (fn = 0; fn < to->n; fn++) {\r
+ cs[fn][0] = to->code[fn];\r
+ if (onig_st_lookup(Unfold1Table, (st_data_t )cs[fn][0],\r
+ (void* )&z3) != 0) {\r
+ for (i = 0; i < z3->n; i++) {\r
+ cs[fn][i+1] = z3->code[i];\r
+ }\r
+ ncs[fn] = z3->n + 1;\r
+ }\r
+ else\r
+ ncs[fn] = 1;\r
+ }\r
+\r
+ if (fn == 2) {\r
+ for (i = 0; i < ncs[0]; i++) {\r
+ for (j = 0; j < ncs[1]; j++) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 2;\r
+ items[n].code[0] = cs[0][i];\r
+ items[n].code[1] = cs[1][j];\r
+ n++;\r
+ }\r
+ }\r
+\r
+ if (onig_st_lookup(Unfold2Table, (st_data_t )to->code,\r
+ (void* )&z2) != 0) {\r
+ for (i = 0; i < z2->n; i++) {\r
+ if (z2->code[i] == code) continue;\r
+\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = z2->code[i];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ for (i = 0; i < ncs[0]; i++) {\r
+ for (j = 0; j < ncs[1]; j++) {\r
+ for (k = 0; k < ncs[2]; k++) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 3;\r
+ items[n].code[0] = cs[0][i];\r
+ items[n].code[1] = cs[1][j];\r
+ items[n].code[2] = cs[2][k];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (onig_st_lookup(Unfold3Table, (st_data_t )to->code,\r
+ (void* )&z2) != 0) {\r
+ for (i = 0; i < z2->n; i++) {\r
+ if (z2->code[i] == code) continue;\r
+\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = z2->code[i];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* multi char folded code is not head of another folded multi char */\r
+ flag = 0; /* DISABLE_CASE_FOLD_MULTI_CHAR(flag); */\r
+ }\r
+ }\r
+ else {\r
+ if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {\r
+ for (i = 0; i < to->n; i++) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = to->code[i];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\r
+ p += len;\r
+ if (p < end) {\r
+ int clen;\r
+\r
+ codes[0] = code;\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0\r
+ && to->n == 1) {\r
+ codes[1] = to->code[0];\r
+ }\r
+ else\r
+ codes[1] = code;\r
+\r
+ clen = enclen(enc, p);\r
+ len += clen;\r
+ if (onig_st_lookup(Unfold2Table, (st_data_t )codes, (void* )&z2) != 0) {\r
+ for (i = 0; i < z2->n; i++) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = z2->code[i];\r
+ n++;\r
+ }\r
+ }\r
+\r
+ p += clen;\r
+ if (p < end) {\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0\r
+ && to->n == 1) {\r
+ codes[2] = to->code[0];\r
+ }\r
+ else\r
+ codes[2] = code;\r
+\r
+ clen = enclen(enc, p);\r
+ len += clen;\r
+ if (onig_st_lookup(Unfold3Table, (st_data_t )codes,\r
+ (void* )&z2) != 0) {\r
+ for (i = 0; i < z2->n; i++) {\r
+ items[n].byte_len = len;\r
+ items[n].code_len = 1;\r
+ items[n].code[0] = z2->code[i];\r
+ n++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return n;\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ utf16_le.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regenc.h"\r
+\r
+static const int EncLen_UTF16[] = {\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\r
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2\r
+};\r
+\r
+static int\r
+utf16le_code_to_mbclen(OnigCodePoint code)\r
+{\r
+ return (code > 0xffff ? 4 : 2);\r
+}\r
+\r
+static int\r
+utf16le_mbc_enc_len(const UChar* p)\r
+{\r
+ return EncLen_UTF16[*(p+1)];\r
+}\r
+\r
+static int\r
+utf16le_is_mbc_newline(const UChar* p, const UChar* end)\r
+{\r
+ if (p + 1 < end) {\r
+ if (*p == 0x0a && *(p+1) == 0x00)\r
+ return 1;\r
+#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\r
+ if ((\r
+#ifndef USE_CRNL_AS_LINE_TERMINATOR\r
+ *p == 0x0d ||\r
+#endif\r
+ *p == 0x85) && *(p+1) == 0x00)\r
+ return 1;\r
+ if (*(p+1) == 0x20 && (*p == 0x29 || *p == 0x28))\r
+ return 1;\r
+#endif\r
+ }\r
+ return 0;\r
+}\r
+\r
+static OnigCodePoint\r
+utf16le_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\r
+{\r
+ OnigCodePoint code;\r
+ UChar c0 = *p;\r
+ UChar c1 = *(p+1);\r
+\r
+ if (UTF16_IS_SURROGATE_FIRST(c1)) {\r
+ code = ((((c1 - 0xd8) << 2) + ((c0 & 0xc0) >> 6) + 1) << 16)\r
+ + ((((c0 & 0x3f) << 2) + (p[3] - 0xdc)) << 8)\r
+ + p[2];\r
+ }\r
+ else {\r
+ code = c1 * 256 + p[0];\r
+ }\r
+ return code;\r
+}\r
+\r
+static int\r
+utf16le_code_to_mbc(OnigCodePoint code, UChar *buf)\r
+{\r
+ UChar* p = buf;\r
+\r
+ if (code > 0xffff) {\r
+ unsigned int plane, high;\r
+\r
+ plane = (code >> 16) - 1;\r
+ high = (code & 0xff00) >> 8;\r
+\r
+ *p++ = (UChar)(((plane & 0x03) << 6) + (high >> 2));\r
+ *p++ = (UChar)((plane >> 2) + 0xd8);\r
+ *p++ = (UChar )(code & 0xff);\r
+ *p = (high & 0x03) + 0xdc;\r
+ return 4;\r
+ }\r
+ else {\r
+ *p++ = (UChar )(code & 0xff);\r
+ *p++ = (UChar )((code & 0xff00) >> 8);\r
+ return 2;\r
+ }\r
+}\r
+\r
+static int\r
+utf16le_mbc_case_fold(OnigCaseFoldType flag,\r
+ const UChar** pp, const UChar* end, UChar* fold)\r
+{\r
+ const UChar* p = *pp;\r
+\r
+ if (ONIGENC_IS_ASCII_CODE(*p) && *(p+1) == 0) {\r
+#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\r
+ if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\r
+ if (*p == 0x49) {\r
+ *fold++ = 0x31;\r
+ *fold = 0x01;\r
+ (*pp) += 2;\r
+ return 2;\r
+ }\r
+ }\r
+#endif\r
+\r
+ *fold++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\r
+ *fold = 0;\r
+ *pp += 2;\r
+ return 2;\r
+ }\r
+ else\r
+ return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF16_LE, flag, pp, end,\r
+ fold);\r
+}\r
+\r
+#if 0\r
+static int\r
+utf16le_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp,\r
+ const UChar* end)\r
+{\r
+ const UChar* p = *pp;\r
+\r
+ (*pp) += EncLen_UTF16[*(p+1)];\r
+\r
+ if (*(p+1) == 0) {\r
+ int c, v;\r
+\r
+ if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\r
+ return TRUE;\r
+ }\r
+\r
+ c = *p;\r
+ v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,\r
+ (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\r
+ if ((v | BIT_CTYPE_LOWER) != 0) {\r
+ /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\r
+ if (c >= 0xaa && c <= 0xba)\r
+ return FALSE;\r
+ else\r
+ return TRUE;\r
+ }\r
+ return (v != 0 ? TRUE : FALSE);\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+#endif\r
+\r
+static UChar*\r
+utf16le_left_adjust_char_head(const UChar* start, const UChar* s)\r
+{\r
+ if (s <= start) return (UChar* )s;\r
+\r
+ if ((s - start) % 2 == 1) {\r
+ s--;\r
+ }\r
+\r
+ if (UTF16_IS_SURROGATE_SECOND(*(s+1)) && s > start + 1)\r
+ s -= 2;\r
+\r
+ return (UChar* )s;\r
+}\r
+\r
+static int\r
+utf16le_get_case_fold_codes_by_str(OnigCaseFoldType flag,\r
+ const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\r
+{\r
+ return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF16_LE,\r
+ flag, p, end, items);\r
+}\r
+\r
+OnigEncodingType OnigEncodingUTF16_LE = {\r
+ utf16le_mbc_enc_len,\r
+ "UTF-16LE", /* name */\r
+ 4, /* max byte length */\r
+ 2, /* min byte length */\r
+ utf16le_is_mbc_newline,\r
+ utf16le_mbc_to_code,\r
+ utf16le_code_to_mbclen,\r
+ utf16le_code_to_mbc,\r
+ utf16le_mbc_case_fold,\r
+ onigenc_unicode_apply_all_case_fold,\r
+ utf16le_get_case_fold_codes_by_str,\r
+ onigenc_unicode_property_name_to_ctype,\r
+ onigenc_unicode_is_code_ctype,\r
+ onigenc_utf16_32_get_ctype_code_range,\r
+ utf16le_left_adjust_char_head,\r
+ onigenc_always_false_is_allowed_reverse_match\r
+};\r
--- /dev/null
+#ifndef ONIGGNU_H\r
+#define ONIGGNU_H\r
+/**********************************************************************\r
+ oniggnu.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2005 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "oniguruma.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define RE_MBCTYPE_ASCII 0\r
+#define RE_MBCTYPE_EUC 1\r
+#define RE_MBCTYPE_SJIS 2\r
+#define RE_MBCTYPE_UTF8 3\r
+\r
+/* GNU regex options */\r
+#ifndef RE_NREGS\r
+#define RE_NREGS ONIG_NREGION\r
+#endif\r
+\r
+#define RE_OPTION_IGNORECASE ONIG_OPTION_IGNORECASE\r
+#define RE_OPTION_EXTENDED ONIG_OPTION_EXTEND\r
+#define RE_OPTION_MULTILINE ONIG_OPTION_MULTILINE\r
+#define RE_OPTION_SINGLELINE ONIG_OPTION_SINGLELINE\r
+#define RE_OPTION_LONGEST ONIG_OPTION_FIND_LONGEST\r
+#define RE_OPTION_POSIXLINE (RE_OPTION_MULTILINE|RE_OPTION_SINGLELINE)\r
+#define RE_OPTION_FIND_NOT_EMPTY ONIG_OPTION_FIND_NOT_EMPTY\r
+#define RE_OPTION_NEGATE_SINGLELINE ONIG_OPTION_NEGATE_SINGLELINE\r
+#define RE_OPTION_DONT_CAPTURE_GROUP ONIG_OPTION_DONT_CAPTURE_GROUP\r
+#define RE_OPTION_CAPTURE_GROUP ONIG_OPTION_CAPTURE_GROUP\r
+\r
+\r
+ONIG_EXTERN\r
+void re_mbcinit P_((int));\r
+ONIG_EXTERN\r
+int re_compile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));\r
+ONIG_EXTERN\r
+int re_recompile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));\r
+ONIG_EXTERN\r
+void re_free_pattern P_((struct re_pattern_buffer*));\r
+ONIG_EXTERN\r
+int re_adjust_startpos P_((struct re_pattern_buffer*, const char*, int, int, int));\r
+ONIG_EXTERN\r
+int re_search P_((struct re_pattern_buffer*, const char*, int, int, int, struct re_registers*));\r
+ONIG_EXTERN\r
+int re_match P_((struct re_pattern_buffer*, const char *, int, int, struct re_registers*));\r
+ONIG_EXTERN\r
+void re_set_casetable P_((const char*));\r
+ONIG_EXTERN\r
+void re_free_registers P_((struct re_registers*));\r
+ONIG_EXTERN\r
+int re_alloc_pattern P_((struct re_pattern_buffer**)); /* added */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* ONIGGNU_H */\r
--- /dev/null
+#ifndef ONIGPOSIX_H\r
+#define ONIGPOSIX_H\r
+/**********************************************************************\r
+ onigposix.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2005 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+#include "OnigurumaUefiPort.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/* options */\r
+#define REG_ICASE (1<<0)\r
+#define REG_NEWLINE (1<<1)\r
+#define REG_NOTBOL (1<<2)\r
+#define REG_NOTEOL (1<<3)\r
+#define REG_EXTENDED (1<<4) /* if not setted, Basic Onigular Expression */\r
+#define REG_NOSUB (1<<5)\r
+\r
+/* POSIX error codes */\r
+#define REG_NOMATCH 1\r
+#define REG_BADPAT 2\r
+#define REG_ECOLLATE 3\r
+#define REG_ECTYPE 4\r
+#define REG_EESCAPE 5\r
+#define REG_ESUBREG 6\r
+#define REG_EBRACK 7\r
+#define REG_EPAREN 8\r
+#define REG_EBRACE 9\r
+#define REG_BADBR 10\r
+#define REG_ERANGE 11\r
+#define REG_ESPACE 12\r
+#define REG_BADRPT 13\r
+\r
+/* extended error codes */\r
+#define REG_EONIG_INTERNAL 14\r
+#define REG_EONIG_BADWC 15\r
+#define REG_EONIG_BADARG 16\r
+#define REG_EONIG_THREAD 17\r
+\r
+/* character encodings (for reg_set_encoding()) */\r
+#define REG_POSIX_ENCODING_ASCII 0\r
+#define REG_POSIX_ENCODING_EUC_JP 1\r
+#define REG_POSIX_ENCODING_SJIS 2\r
+#define REG_POSIX_ENCODING_UTF8 3\r
+#define REG_POSIX_ENCODING_UTF16_BE 4\r
+#define REG_POSIX_ENCODING_UTF16_LE 5\r
+\r
+\r
+typedef int regoff_t;\r
+\r
+typedef struct {\r
+ regoff_t rm_so;\r
+ regoff_t rm_eo;\r
+} regmatch_t;\r
+\r
+/* POSIX regex_t */\r
+typedef struct {\r
+ void* onig; /* Oniguruma regex_t* */\r
+ size_t re_nsub;\r
+ int comp_options;\r
+} regex_t;\r
+\r
+\r
+#ifndef P_\r
+#if defined(__STDC__) || defined(_WIN32)\r
+# define P_(args) args\r
+#else\r
+# define P_(args) ()\r
+#endif\r
+#endif\r
+\r
+#ifndef ONIG_EXTERN\r
+#if defined(_WIN32) && !defined(__GNUC__)\r
+#if defined(EXPORT)\r
+#define ONIG_EXTERN extern __declspec(dllexport)\r
+#else\r
+#define ONIG_EXTERN extern __declspec(dllimport)\r
+#endif\r
+#endif\r
+#endif\r
+\r
+#ifndef ONIG_EXTERN\r
+#define ONIG_EXTERN extern\r
+#endif\r
+\r
+#ifndef ONIGURUMA_H\r
+typedef unsigned int OnigOptionType;\r
+\r
+/* syntax */\r
+typedef struct {\r
+ unsigned int op;\r
+ unsigned int op2;\r
+ unsigned int behavior;\r
+ OnigOptionType options; /* default option */\r
+} OnigSyntaxType;\r
+\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxJava;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;\r
+\r
+/* predefined syntaxes (see regsyntax.c) */\r
+#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic)\r
+#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended)\r
+#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs)\r
+#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep)\r
+#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex)\r
+#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava)\r
+#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl)\r
+#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby)\r
+/* default syntax */\r
+#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax\r
+\r
+ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax;\r
+\r
+ONIG_EXTERN int onig_set_default_syntax P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from));\r
+ONIG_EXTERN const char* onig_version P_((void));\r
+ONIG_EXTERN const char* onig_copyright P_((void));\r
+\r
+#endif /* ONIGURUMA_H */\r
+\r
+\r
+ONIG_EXTERN int regcomp P_((regex_t* reg, const char* pat, int options));\r
+ONIG_EXTERN int regexec P_((regex_t* reg, const char* str, size_t nmatch, regmatch_t* matches, int options));\r
+ONIG_EXTERN void regfree P_((regex_t* reg));\r
+ONIG_EXTERN size_t regerror P_((int code, const regex_t* reg, char* buf, size_t size));\r
+\r
+/* extended API */\r
+ONIG_EXTERN void reg_set_encoding P_((int enc));\r
+ONIG_EXTERN int reg_name_to_group_numbers P_((regex_t* reg, const unsigned char* name, const unsigned char* name_end, int** nums));\r
+ONIG_EXTERN int reg_foreach_name P_((regex_t* reg, int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*), void* arg));\r
+ONIG_EXTERN int reg_number_of_names P_((regex_t* reg));\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* ONIGPOSIX_H */\r
--- /dev/null
+#ifndef ONIGURUMA_H\r
+#define ONIGURUMA_H\r
+/**********************************************************************\r
+ oniguruma.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "OnigurumaUefiPort.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define ONIGURUMA\r
+#define ONIGURUMA_VERSION_MAJOR 5\r
+#define ONIGURUMA_VERSION_MINOR 9\r
+#define ONIGURUMA_VERSION_TEENY 6\r
+\r
+#ifdef __cplusplus\r
+# ifndef HAVE_PROTOTYPES\r
+# define HAVE_PROTOTYPES 1\r
+# endif\r
+# ifndef HAVE_STDARG_PROTOTYPES\r
+# define HAVE_STDARG_PROTOTYPES 1\r
+# endif\r
+#endif\r
+\r
+/* escape Mac OS X/Xcode 2.4/gcc 4.0.1 problem */\r
+#if defined(__APPLE__) && defined(__GNUC__) && __GNUC__ >= 4\r
+# ifndef HAVE_STDARG_PROTOTYPES\r
+# define HAVE_STDARG_PROTOTYPES 1\r
+# endif\r
+#endif\r
+\r
+#ifdef HAVE_STDARG_H\r
+# ifndef HAVE_STDARG_PROTOTYPES\r
+# define HAVE_STDARG_PROTOTYPES 1\r
+# endif\r
+#endif\r
+\r
+#ifndef P_\r
+#if defined(__STDC__) || defined(_WIN32)\r
+# define P_(args) args\r
+#else\r
+# define P_(args) ()\r
+#endif\r
+#endif\r
+\r
+#ifndef PV_\r
+#ifdef HAVE_STDARG_PROTOTYPES\r
+# define PV_(args) args\r
+#else\r
+# define PV_(args) ()\r
+#endif\r
+#endif\r
+\r
+#ifndef ONIG_EXTERN\r
+#if defined(_WIN32) && !defined(__GNUC__)\r
+#if defined(EXPORT) || defined(RUBY_EXPORT)\r
+#define ONIG_EXTERN extern __declspec(dllexport)\r
+#else\r
+#define ONIG_EXTERN extern __declspec(dllimport)\r
+#endif\r
+#endif\r
+#endif\r
+\r
+#ifndef ONIG_EXTERN\r
+#define ONIG_EXTERN extern\r
+#endif\r
+\r
+/* PART: character encoding */\r
+\r
+#ifndef ONIG_ESCAPE_UCHAR_COLLISION\r
+#define UChar OnigUChar\r
+#endif\r
+\r
+#ifdef _WIN32\r
+# include <windows.h>\r
+typedef ULONG_PTR OnigCodePoint;\r
+#else\r
+typedef unsigned long OnigCodePoint;\r
+#endif\r
+typedef unsigned char OnigUChar;\r
+typedef unsigned int OnigCtype;\r
+typedef unsigned int OnigDistance;\r
+\r
+#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0)\r
+\r
+typedef unsigned int OnigCaseFoldType; /* case fold flag */\r
+\r
+ONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag;\r
+\r
+/* #define ONIGENC_CASE_FOLD_HIRAGANA_KATAKANA (1<<1) */\r
+/* #define ONIGENC_CASE_FOLD_KATAKANA_WIDTH (1<<2) */\r
+#define ONIGENC_CASE_FOLD_TURKISH_AZERI (1<<20)\r
+#define INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR (1<<30)\r
+\r
+#define ONIGENC_CASE_FOLD_MIN INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR\r
+#define ONIGENC_CASE_FOLD_DEFAULT OnigDefaultCaseFoldFlag\r
+\r
+\r
+#define ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN 3\r
+#define ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM 13\r
+/* 13 => Unicode:0x1ffc */\r
+\r
+/* code range */\r
+#define ONIGENC_CODE_RANGE_NUM(range) ((int )range[0])\r
+#define ONIGENC_CODE_RANGE_FROM(range,i) range[((i)*2) + 1]\r
+#define ONIGENC_CODE_RANGE_TO(range,i) range[((i)*2) + 2]\r
+\r
+typedef struct {\r
+ int byte_len; /* argument(original) character(s) byte length */\r
+ int code_len; /* number of code */\r
+ OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN];\r
+} OnigCaseFoldCodeItem;\r
+\r
+typedef struct {\r
+ OnigCodePoint esc;\r
+ OnigCodePoint anychar;\r
+ OnigCodePoint anytime;\r
+ OnigCodePoint zero_or_one_time;\r
+ OnigCodePoint one_or_more_time;\r
+ OnigCodePoint anychar_anytime;\r
+} OnigMetaCharTableType;\r
+ \r
+typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg);\r
+\r
+typedef struct OnigEncodingTypeST {\r
+ int (*mbc_enc_len)(const OnigUChar* p);\r
+ const char* name;\r
+ int max_enc_len;\r
+ int min_enc_len;\r
+ int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end);\r
+ OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end);\r
+ int (*code_to_mbclen)(OnigCodePoint code);\r
+ int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf);\r
+ int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to);\r
+ int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg);\r
+ int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[]);\r
+ int (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end);\r
+ int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype);\r
+ int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]);\r
+ OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p);\r
+ int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end);\r
+} OnigEncodingType;\r
+\r
+typedef OnigEncodingType* OnigEncoding;\r
+\r
+ONIG_EXTERN OnigEncodingType OnigEncodingASCII;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_1;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_2;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_3;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_4;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_5;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_6;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_7;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_8;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_9;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_10;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_11;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_13;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_14;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_15;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_16;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF8;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_BE;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF16_LE;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_BE;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF32_LE;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_JP;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_TW;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_KR;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_CN;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingSJIS;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingKOI8;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingKOI8_R;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingCP1251;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingBIG5;\r
+ONIG_EXTERN OnigEncodingType OnigEncodingGB18030;\r
+\r
+#define ONIG_ENCODING_ASCII (&OnigEncodingASCII)\r
+#define ONIG_ENCODING_ISO_8859_1 (&OnigEncodingISO_8859_1)\r
+#define ONIG_ENCODING_ISO_8859_2 (&OnigEncodingISO_8859_2)\r
+#define ONIG_ENCODING_ISO_8859_3 (&OnigEncodingISO_8859_3)\r
+#define ONIG_ENCODING_ISO_8859_4 (&OnigEncodingISO_8859_4)\r
+#define ONIG_ENCODING_ISO_8859_5 (&OnigEncodingISO_8859_5)\r
+#define ONIG_ENCODING_ISO_8859_6 (&OnigEncodingISO_8859_6)\r
+#define ONIG_ENCODING_ISO_8859_7 (&OnigEncodingISO_8859_7)\r
+#define ONIG_ENCODING_ISO_8859_8 (&OnigEncodingISO_8859_8)\r
+#define ONIG_ENCODING_ISO_8859_9 (&OnigEncodingISO_8859_9)\r
+#define ONIG_ENCODING_ISO_8859_10 (&OnigEncodingISO_8859_10)\r
+#define ONIG_ENCODING_ISO_8859_11 (&OnigEncodingISO_8859_11)\r
+#define ONIG_ENCODING_ISO_8859_13 (&OnigEncodingISO_8859_13)\r
+#define ONIG_ENCODING_ISO_8859_14 (&OnigEncodingISO_8859_14)\r
+#define ONIG_ENCODING_ISO_8859_15 (&OnigEncodingISO_8859_15)\r
+#define ONIG_ENCODING_ISO_8859_16 (&OnigEncodingISO_8859_16)\r
+#define ONIG_ENCODING_UTF8 (&OnigEncodingUTF8)\r
+#define ONIG_ENCODING_UTF16_BE (&OnigEncodingUTF16_BE)\r
+#define ONIG_ENCODING_UTF16_LE (&OnigEncodingUTF16_LE)\r
+#define ONIG_ENCODING_UTF32_BE (&OnigEncodingUTF32_BE)\r
+#define ONIG_ENCODING_UTF32_LE (&OnigEncodingUTF32_LE)\r
+#define ONIG_ENCODING_EUC_JP (&OnigEncodingEUC_JP)\r
+#define ONIG_ENCODING_EUC_TW (&OnigEncodingEUC_TW)\r
+#define ONIG_ENCODING_EUC_KR (&OnigEncodingEUC_KR)\r
+#define ONIG_ENCODING_EUC_CN (&OnigEncodingEUC_CN)\r
+#define ONIG_ENCODING_SJIS (&OnigEncodingSJIS)\r
+#define ONIG_ENCODING_KOI8 (&OnigEncodingKOI8)\r
+#define ONIG_ENCODING_KOI8_R (&OnigEncodingKOI8_R)\r
+#define ONIG_ENCODING_CP1251 (&OnigEncodingCP1251)\r
+#define ONIG_ENCODING_BIG5 (&OnigEncodingBIG5)\r
+#define ONIG_ENCODING_GB18030 (&OnigEncodingGB18030)\r
+\r
+#define ONIG_ENCODING_UNDEF ((OnigEncoding )0)\r
+\r
+\r
+/* work size */\r
+#define ONIGENC_CODE_TO_MBC_MAXLEN 7\r
+#define ONIGENC_MBC_CASE_FOLD_MAXLEN 18\r
+/* 18: 6(max-byte) * 3(case-fold chars) */\r
+\r
+/* character types */\r
+#define ONIGENC_CTYPE_NEWLINE 0\r
+#define ONIGENC_CTYPE_ALPHA 1\r
+#define ONIGENC_CTYPE_BLANK 2\r
+#define ONIGENC_CTYPE_CNTRL 3\r
+#define ONIGENC_CTYPE_DIGIT 4\r
+#define ONIGENC_CTYPE_GRAPH 5\r
+#define ONIGENC_CTYPE_LOWER 6\r
+#define ONIGENC_CTYPE_PRINT 7\r
+#define ONIGENC_CTYPE_PUNCT 8\r
+#define ONIGENC_CTYPE_SPACE 9\r
+#define ONIGENC_CTYPE_UPPER 10\r
+#define ONIGENC_CTYPE_XDIGIT 11\r
+#define ONIGENC_CTYPE_WORD 12\r
+#define ONIGENC_CTYPE_ALNUM 13 /* alpha || digit */\r
+#define ONIGENC_CTYPE_ASCII 14\r
+#define ONIGENC_MAX_STD_CTYPE ONIGENC_CTYPE_ASCII\r
+\r
+\r
+#define onig_enc_len(enc,p,end) ONIGENC_MBC_ENC_LEN(enc,p)\r
+\r
+#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF)\r
+#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1)\r
+#define ONIGENC_IS_MBC_HEAD(enc,p) (ONIGENC_MBC_ENC_LEN(enc,p) != 1)\r
+#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128)\r
+#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128)\r
+#define ONIGENC_IS_MBC_WORD(enc,s,end) \\r
+ ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end))\r
+\r
+\r
+#define ONIGENC_NAME(enc) ((enc)->name)\r
+\r
+#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \\r
+ (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf)\r
+#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \\r
+ (enc)->is_allowed_reverse_match(s,end)\r
+#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \\r
+ (enc)->left_adjust_char_head(start, s)\r
+#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \\r
+ (enc)->apply_all_case_fold(case_fold_flag,f,arg)\r
+#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \\r
+ (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs)\r
+#define ONIGENC_STEP_BACK(enc,start,s,n) \\r
+ onigenc_step_back((enc),(start),(s),(n))\r
+\r
+#define ONIGENC_MBC_ENC_LEN(enc,p) (enc)->mbc_enc_len(p)\r
+#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len)\r
+#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc)\r
+#define ONIGENC_MBC_MINLEN(enc) ((enc)->min_enc_len)\r
+#define ONIGENC_IS_MBC_NEWLINE(enc,p,end) (enc)->is_mbc_newline((p),(end))\r
+#define ONIGENC_MBC_TO_CODE(enc,p,end) (enc)->mbc_to_code((p),(end))\r
+#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code)\r
+#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf)\r
+#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \\r
+ (enc)->property_name_to_ctype(enc,p,end)\r
+\r
+#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->is_code_ctype(code,ctype)\r
+\r
+#define ONIGENC_IS_CODE_NEWLINE(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE)\r
+#define ONIGENC_IS_CODE_GRAPH(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH)\r
+#define ONIGENC_IS_CODE_PRINT(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT)\r
+#define ONIGENC_IS_CODE_ALNUM(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM)\r
+#define ONIGENC_IS_CODE_ALPHA(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA)\r
+#define ONIGENC_IS_CODE_LOWER(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER)\r
+#define ONIGENC_IS_CODE_UPPER(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER)\r
+#define ONIGENC_IS_CODE_CNTRL(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL)\r
+#define ONIGENC_IS_CODE_PUNCT(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT)\r
+#define ONIGENC_IS_CODE_SPACE(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE)\r
+#define ONIGENC_IS_CODE_BLANK(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK)\r
+#define ONIGENC_IS_CODE_DIGIT(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT)\r
+#define ONIGENC_IS_CODE_XDIGIT(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT)\r
+#define ONIGENC_IS_CODE_WORD(enc,code) \\r
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD)\r
+\r
+#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \\r
+ (enc)->get_ctype_code_range(ctype,sbout,ranges)\r
+\r
+ONIG_EXTERN\r
+OnigUChar* onigenc_step_back P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, int n));\r
+\r
+\r
+/* encoding API */\r
+ONIG_EXTERN\r
+int onigenc_init P_((void));\r
+ONIG_EXTERN\r
+int onigenc_set_default_encoding P_((OnigEncoding enc));\r
+ONIG_EXTERN\r
+OnigEncoding onigenc_get_default_encoding P_((void));\r
+ONIG_EXTERN\r
+void onigenc_set_default_caseconv_table P_((const OnigUChar* table));\r
+ONIG_EXTERN\r
+OnigUChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar** prev));\r
+ONIG_EXTERN\r
+OnigUChar* onigenc_get_prev_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\r
+ONIG_EXTERN\r
+OnigUChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\r
+ONIG_EXTERN\r
+OnigUChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\r
+ONIG_EXTERN\r
+int onigenc_strlen P_((OnigEncoding enc, const OnigUChar* p, const OnigUChar* end));\r
+ONIG_EXTERN\r
+int onigenc_strlen_null P_((OnigEncoding enc, const OnigUChar* p));\r
+ONIG_EXTERN\r
+int onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p));\r
+\r
+\r
+\r
+/* PART: regular expression */\r
+\r
+/* config parameters */\r
+#define ONIG_NREGION 10\r
+#define ONIG_MAX_BACKREF_NUM 1000\r
+#define ONIG_MAX_REPEAT_NUM 100000\r
+#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000\r
+/* constants */\r
+#define ONIG_MAX_ERROR_MESSAGE_LEN 90\r
+\r
+typedef unsigned int OnigOptionType;\r
+\r
+#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE\r
+\r
+/* options */\r
+#define ONIG_OPTION_NONE 0U\r
+#define ONIG_OPTION_IGNORECASE 1U\r
+#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1)\r
+#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1)\r
+#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1)\r
+#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1)\r
+#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1)\r
+#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1)\r
+#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1)\r
+#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1)\r
+/* options (search time) */\r
+#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1)\r
+#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1)\r
+#define ONIG_OPTION_POSIX_REGION (ONIG_OPTION_NOTEOL << 1)\r
+#define ONIG_OPTION_MAXBIT ONIG_OPTION_POSIX_REGION /* limit */\r
+\r
+#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt))\r
+#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt))\r
+#define ONIG_IS_OPTION_ON(options,option) ((options) & (option))\r
+\r
+/* syntax */\r
+typedef struct {\r
+ unsigned int op;\r
+ unsigned int op2;\r
+ unsigned int behavior;\r
+ OnigOptionType options; /* default option */\r
+ OnigMetaCharTableType meta_char_table;\r
+} OnigSyntaxType;\r
+\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxASIS;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxJava;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl_NG;\r
+ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;\r
+\r
+/* predefined syntaxes (see regsyntax.c) */\r
+#define ONIG_SYNTAX_ASIS (&OnigSyntaxASIS)\r
+#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic)\r
+#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended)\r
+#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs)\r
+#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep)\r
+#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex)\r
+#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava)\r
+#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl)\r
+#define ONIG_SYNTAX_PERL_NG (&OnigSyntaxPerl_NG)\r
+#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby)\r
+\r
+/* default syntax */\r
+ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax;\r
+#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax\r
+\r
+/* syntax (operators) */\r
+#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1U<<0)\r
+#define ONIG_SYN_OP_DOT_ANYCHAR (1U<<1) /* . */\r
+#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1U<<2) /* * */\r
+#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1U<<3)\r
+#define ONIG_SYN_OP_PLUS_ONE_INF (1U<<4) /* + */\r
+#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1U<<5)\r
+#define ONIG_SYN_OP_QMARK_ZERO_ONE (1U<<6) /* ? */\r
+#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1U<<7)\r
+#define ONIG_SYN_OP_BRACE_INTERVAL (1U<<8) /* {lower,upper} */\r
+#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1U<<9) /* \{lower,upper\} */\r
+#define ONIG_SYN_OP_VBAR_ALT (1U<<10) /* | */\r
+#define ONIG_SYN_OP_ESC_VBAR_ALT (1U<<11) /* \| */\r
+#define ONIG_SYN_OP_LPAREN_SUBEXP (1U<<12) /* (...) */\r
+#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1U<<13) /* \(...\) */\r
+#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1U<<14) /* \A, \Z, \z */\r
+#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1U<<15) /* \G */\r
+#define ONIG_SYN_OP_DECIMAL_BACKREF (1U<<16) /* \num */\r
+#define ONIG_SYN_OP_BRACKET_CC (1U<<17) /* [...] */\r
+#define ONIG_SYN_OP_ESC_W_WORD (1U<<18) /* \w, \W */\r
+#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1U<<19) /* \<. \> */\r
+#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1U<<20) /* \b, \B */\r
+#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1U<<21) /* \s, \S */\r
+#define ONIG_SYN_OP_ESC_D_DIGIT (1U<<22) /* \d, \D */\r
+#define ONIG_SYN_OP_LINE_ANCHOR (1U<<23) /* ^, $ */\r
+#define ONIG_SYN_OP_POSIX_BRACKET (1U<<24) /* [:xxxx:] */\r
+#define ONIG_SYN_OP_QMARK_NON_GREEDY (1U<<25) /* ??,*?,+?,{n,m}? */\r
+#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1U<<26) /* \n,\r,\t,\a ... */\r
+#define ONIG_SYN_OP_ESC_C_CONTROL (1U<<27) /* \cx */\r
+#define ONIG_SYN_OP_ESC_OCTAL3 (1U<<28) /* \OOO */\r
+#define ONIG_SYN_OP_ESC_X_HEX2 (1U<<29) /* \xHH */\r
+#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1U<<30) /* \x{7HHHHHHH} */\r
+\r
+#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1U<<0) /* \Q...\E */\r
+#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1U<<1) /* (?...) */\r
+#define ONIG_SYN_OP2_OPTION_PERL (1U<<2) /* (?imsx),(?-imsx) */\r
+#define ONIG_SYN_OP2_OPTION_RUBY (1U<<3) /* (?imx), (?-imx) */\r
+#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1U<<4) /* ?+,*+,++ */\r
+#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1U<<5) /* {n,m}+ */\r
+#define ONIG_SYN_OP2_CCLASS_SET_OP (1U<<6) /* [...&&..[..]..] */\r
+#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1U<<7) /* (?<name>...) */\r
+#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1U<<8) /* \k<name> */\r
+#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1U<<9) /* \g<name>, \g<n> */\r
+#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1U<<10) /* (?@..),(?@<x>..) */\r
+#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1U<<11) /* \C-x */\r
+#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1U<<12) /* \M-x */\r
+#define ONIG_SYN_OP2_ESC_V_VTAB (1U<<13) /* \v as VTAB */\r
+#define ONIG_SYN_OP2_ESC_U_HEX4 (1U<<14) /* \uHHHH */\r
+#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1U<<15) /* \`, \' */\r
+#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY (1U<<16) /* \p{...}, \P{...} */\r
+#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \p{^..}, \P{^..} */\r
+/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */\r
+#define ONIG_SYN_OP2_ESC_H_XDIGIT (1U<<19) /* \h, \H */\r
+#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */\r
+\r
+/* syntax (behavior) */\r
+#define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1U<<31) /* not implemented */\r
+#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS (1U<<0) /* ?, *, +, {n,m} */\r
+#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS (1U<<1) /* error or ignore */\r
+#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1U<<2) /* ...)... */\r
+#define ONIG_SYN_ALLOW_INVALID_INTERVAL (1U<<3) /* {??? */\r
+#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV (1U<<4) /* {,n} => {0,n} */\r
+#define ONIG_SYN_STRICT_CHECK_BACKREF (1U<<5) /* /(\1)/,/\1()/ ..*/\r
+#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1U<<6) /* (?<=a|bc) */\r
+#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1U<<7) /* see doc/RE */\r
+#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8) /* (?<x>)(?<x>) */\r
+#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY (1U<<9) /* a{n}?=(?:a{n})? */\r
+\r
+/* syntax (behavior) in char class [...] */\r
+#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1U<<20) /* [^...] */\r
+#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1U<<21) /* [..\w..] etc.. */\r
+#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1U<<22)\r
+#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1U<<23) /* [0-9-a]=[0-9\-a] */\r
+/* syntax (behavior) warning */\r
+#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1U<<24) /* [,-,] */\r
+#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1U<<25) /* (?:a*)+ */\r
+\r
+/* meta character specifiers (onig_set_meta_char()) */\r
+#define ONIG_META_CHAR_ESCAPE 0\r
+#define ONIG_META_CHAR_ANYCHAR 1\r
+#define ONIG_META_CHAR_ANYTIME 2\r
+#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3\r
+#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4\r
+#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5\r
+\r
+#define ONIG_INEFFECTIVE_META_CHAR 0\r
+\r
+/* error codes */\r
+#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000)\r
+/* normal return */\r
+#define ONIG_NORMAL 0\r
+#define ONIG_MISMATCH -1\r
+#define ONIG_NO_SUPPORT_CONFIG -2\r
+\r
+/* internal error */\r
+#define ONIGERR_MEMORY -5\r
+#define ONIGERR_TYPE_BUG -6\r
+#define ONIGERR_PARSER_BUG -11\r
+#define ONIGERR_STACK_BUG -12\r
+#define ONIGERR_UNDEFINED_BYTECODE -13\r
+#define ONIGERR_UNEXPECTED_BYTECODE -14\r
+#define ONIGERR_MATCH_STACK_LIMIT_OVER -15\r
+#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21\r
+#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22\r
+/* general error */\r
+#define ONIGERR_INVALID_ARGUMENT -30 \r
+/* syntax error */\r
+#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100\r
+#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101\r
+#define ONIGERR_EMPTY_CHAR_CLASS -102\r
+#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103\r
+#define ONIGERR_END_PATTERN_AT_ESCAPE -104\r
+#define ONIGERR_END_PATTERN_AT_META -105\r
+#define ONIGERR_END_PATTERN_AT_CONTROL -106\r
+#define ONIGERR_META_CODE_SYNTAX -108\r
+#define ONIGERR_CONTROL_CODE_SYNTAX -109\r
+#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110\r
+#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111\r
+#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112\r
+#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113\r
+#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114\r
+#define ONIGERR_NESTED_REPEAT_OPERATOR -115\r
+#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116\r
+#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117\r
+#define ONIGERR_END_PATTERN_IN_GROUP -118\r
+#define ONIGERR_UNDEFINED_GROUP_OPTION -119\r
+#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121\r
+#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122\r
+#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123\r
+/* values error (syntax error) */\r
+#define ONIGERR_TOO_BIG_NUMBER -200\r
+#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201\r
+#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202\r
+#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203\r
+#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204\r
+#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205\r
+#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206\r
+#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207\r
+#define ONIGERR_INVALID_BACKREF -208\r
+#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209\r
+#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212\r
+#define ONIGERR_EMPTY_GROUP_NAME -214\r
+#define ONIGERR_INVALID_GROUP_NAME -215\r
+#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216\r
+#define ONIGERR_UNDEFINED_NAME_REFERENCE -217\r
+#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218\r
+#define ONIGERR_MULTIPLEX_DEFINED_NAME -219\r
+#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220\r
+#define ONIGERR_NEVER_ENDING_RECURSION -221\r
+#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222\r
+#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223\r
+#define ONIGERR_INVALID_CODE_POINT_VALUE -400\r
+#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400\r
+#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401\r
+#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION -402\r
+#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS -403\r
+\r
+/* errors related to thread */\r
+#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001\r
+\r
+\r
+/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */\r
+#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31\r
+#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \\r
+ ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i])\r
+\r
+typedef struct OnigCaptureTreeNodeStruct {\r
+ int group; /* group number */\r
+ int beg;\r
+ int end;\r
+ int allocated;\r
+ int num_childs;\r
+ struct OnigCaptureTreeNodeStruct** childs;\r
+} OnigCaptureTreeNode;\r
+\r
+/* match result region type */\r
+struct re_registers {\r
+ int allocated;\r
+ int num_regs;\r
+ int* beg;\r
+ int* end;\r
+ /* extended */\r
+ OnigCaptureTreeNode* history_root; /* capture history tree root */\r
+};\r
+\r
+/* capture tree traverse */\r
+#define ONIG_TRAVERSE_CALLBACK_AT_FIRST 1\r
+#define ONIG_TRAVERSE_CALLBACK_AT_LAST 2\r
+#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \\r
+ ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST )\r
+\r
+\r
+#define ONIG_REGION_NOTPOS -1\r
+\r
+typedef struct re_registers OnigRegion;\r
+\r
+typedef struct {\r
+ OnigEncoding enc;\r
+ OnigUChar* par;\r
+ OnigUChar* par_end;\r
+} OnigErrorInfo;\r
+\r
+typedef struct {\r
+ int lower;\r
+ int upper;\r
+} OnigRepeatRange;\r
+\r
+typedef void (*OnigWarnFunc) P_((const char* s));\r
+extern void onig_null_warn P_((const char* s));\r
+#define ONIG_NULL_WARN onig_null_warn\r
+\r
+#define ONIG_CHAR_TABLE_SIZE 256\r
+\r
+/* regex_t state */\r
+#define ONIG_STATE_NORMAL 0\r
+#define ONIG_STATE_SEARCHING 1\r
+#define ONIG_STATE_COMPILING -1\r
+#define ONIG_STATE_MODIFY -2\r
+\r
+#define ONIG_STATE(reg) \\r
+ ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state)\r
+\r
+typedef struct re_pattern_buffer {\r
+ /* common members of BBuf(bytes-buffer) */\r
+ unsigned char* p; /* compiled pattern */\r
+ unsigned int used; /* used space for p */\r
+ unsigned int alloc; /* allocated space for p */\r
+\r
+ int state; /* normal, searching, compiling */\r
+ int num_mem; /* used memory(...) num counted from 1 */\r
+ int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */\r
+ int num_null_check; /* OP_NULL_CHECK_START/END id counter */\r
+ int num_comb_exp_check; /* combination explosion check */\r
+ int num_call; /* number of subexp call */\r
+ unsigned int capture_history; /* (?@...) flag (1-31) */\r
+ unsigned int bt_mem_start; /* need backtrack flag */\r
+ unsigned int bt_mem_end; /* need backtrack flag */\r
+ int stack_pop_level;\r
+ int repeat_range_alloc;\r
+ OnigRepeatRange* repeat_range;\r
+\r
+ OnigEncoding enc;\r
+ OnigOptionType options;\r
+ OnigSyntaxType* syntax;\r
+ OnigCaseFoldType case_fold_flag;\r
+ void* name_table;\r
+\r
+ /* optimization info (string search, char-map and anchors) */\r
+ int optimize; /* optimize flag */\r
+ int threshold_len; /* search str-length for apply optimize */\r
+ int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */\r
+ OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */\r
+ OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */\r
+ int sub_anchor; /* start-anchor for exact or map */\r
+ unsigned char *exact;\r
+ unsigned char *exact_end;\r
+ unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */\r
+ int *int_map; /* BM skip for exact_len > 255 */\r
+ int *int_map_backward; /* BM skip for backward search */\r
+ OnigDistance dmin; /* min-distance of exact or map */\r
+ OnigDistance dmax; /* max-distance of exact or map */\r
+\r
+ /* regex_t link chain */\r
+ struct re_pattern_buffer* chain; /* escape compile-conflict */\r
+} OnigRegexType;\r
+\r
+typedef OnigRegexType* OnigRegex;\r
+\r
+#ifndef ONIG_ESCAPE_REGEX_T_COLLISION\r
+ typedef OnigRegexType regex_t;\r
+#endif\r
+\r
+\r
+typedef struct {\r
+ int num_of_elements;\r
+ OnigEncoding pattern_enc;\r
+ OnigEncoding target_enc;\r
+ OnigSyntaxType* syntax;\r
+ OnigOptionType option;\r
+ OnigCaseFoldType case_fold_flag;\r
+} OnigCompileInfo;\r
+\r
+/* Oniguruma Native API */\r
+ONIG_EXTERN\r
+int onig_init P_((void));\r
+ONIG_EXTERN\r
+int onig_error_code_to_str PV_((OnigUChar* s, int err_code, ...));\r
+ONIG_EXTERN\r
+void onig_set_warn_func P_((OnigWarnFunc f));\r
+ONIG_EXTERN\r
+void onig_set_verb_warn_func P_((OnigWarnFunc f));\r
+ONIG_EXTERN\r
+int onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\r
+ONIG_EXTERN\r
+int onig_reg_init P_((regex_t* reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, OnigSyntaxType* syntax));\r
+int onig_new_without_alloc P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\r
+ONIG_EXTERN\r
+int onig_new_deluxe P_((OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo));\r
+ONIG_EXTERN\r
+void onig_free P_((OnigRegex));\r
+ONIG_EXTERN\r
+void onig_free_body P_((OnigRegex));\r
+ONIG_EXTERN\r
+int onig_recompile P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\r
+ONIG_EXTERN\r
+int onig_recompile_deluxe P_((OnigRegex reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo));\r
+ONIG_EXTERN\r
+int onig_search P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option));\r
+ONIG_EXTERN\r
+int onig_match P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option));\r
+ONIG_EXTERN\r
+OnigRegion* onig_region_new P_((void));\r
+ONIG_EXTERN\r
+void onig_region_init P_((OnigRegion* region));\r
+ONIG_EXTERN\r
+void onig_region_free P_((OnigRegion* region, int free_self));\r
+ONIG_EXTERN\r
+void onig_region_copy P_((OnigRegion* to, OnigRegion* from));\r
+ONIG_EXTERN\r
+void onig_region_clear P_((OnigRegion* region));\r
+ONIG_EXTERN\r
+int onig_region_resize P_((OnigRegion* region, int n));\r
+ONIG_EXTERN\r
+int onig_region_set P_((OnigRegion* region, int at, int beg, int end));\r
+ONIG_EXTERN\r
+int onig_name_to_group_numbers P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums));\r
+ONIG_EXTERN\r
+int onig_name_to_backref_number P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, OnigRegion *region));\r
+ONIG_EXTERN\r
+int onig_foreach_name P_((OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg));\r
+ONIG_EXTERN\r
+int onig_number_of_names P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+int onig_number_of_captures P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+int onig_number_of_capture_histories P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+OnigCaptureTreeNode* onig_get_capture_tree P_((OnigRegion* region));\r
+ONIG_EXTERN\r
+int onig_capture_tree_traverse P_((OnigRegion* region, int at, int(*callback_func)(int,int,int,int,int,void*), void* arg));\r
+ONIG_EXTERN\r
+int onig_noname_group_capture_is_active P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+OnigEncoding onig_get_encoding P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+OnigOptionType onig_get_options P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+OnigCaseFoldType onig_get_case_fold_flag P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+OnigSyntaxType* onig_get_syntax P_((OnigRegex reg));\r
+ONIG_EXTERN\r
+int onig_set_default_syntax P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN\r
+void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from));\r
+ONIG_EXTERN\r
+unsigned int onig_get_syntax_op P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN\r
+unsigned int onig_get_syntax_op2 P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN\r
+unsigned int onig_get_syntax_behavior P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN\r
+OnigOptionType onig_get_syntax_options P_((OnigSyntaxType* syntax));\r
+ONIG_EXTERN\r
+void onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op));\r
+ONIG_EXTERN\r
+void onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2));\r
+ONIG_EXTERN\r
+void onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior));\r
+ONIG_EXTERN\r
+void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options));\r
+ONIG_EXTERN\r
+int onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code));\r
+ONIG_EXTERN\r
+void onig_copy_encoding P_((OnigEncoding to, OnigEncoding from));\r
+ONIG_EXTERN\r
+OnigCaseFoldType onig_get_default_case_fold_flag P_((void));\r
+ONIG_EXTERN\r
+int onig_set_default_case_fold_flag P_((OnigCaseFoldType case_fold_flag));\r
+ONIG_EXTERN\r
+unsigned int onig_get_match_stack_limit_size P_((void));\r
+ONIG_EXTERN\r
+int onig_set_match_stack_limit_size P_((unsigned int size));\r
+ONIG_EXTERN\r
+int onig_end P_((void));\r
+ONIG_EXTERN\r
+const char* onig_version P_((void));\r
+ONIG_EXTERN\r
+const char* onig_copyright P_((void));\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* ONIGURUMA_H */\r
--- /dev/null
+/**********************************************************************\r
+ regcomp.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2013 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regparse.h"\r
+\r
+OnigCaseFoldType OnigDefaultCaseFoldFlag = ONIGENC_CASE_FOLD_MIN;\r
+\r
+extern OnigCaseFoldType\r
+onig_get_default_case_fold_flag(void)\r
+{\r
+ return OnigDefaultCaseFoldFlag;\r
+}\r
+\r
+extern int\r
+onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)\r
+{\r
+ OnigDefaultCaseFoldFlag = case_fold_flag;\r
+ return 0;\r
+}\r
+\r
+\r
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\r
+static unsigned char PadBuf[WORD_ALIGNMENT_SIZE];\r
+#endif\r
+\r
+static UChar*\r
+str_dup(UChar* s, UChar* end)\r
+{\r
+ int len = (int)(end - s);\r
+\r
+ if (len > 0) {\r
+ UChar* r = (UChar* )xmalloc(len + 1);\r
+ CHECK_NULL_RETURN(r);\r
+ xmemcpy(r, s, len);\r
+ r[len] = (UChar )0;\r
+ return r;\r
+ }\r
+ else return NULL;\r
+}\r
+\r
+static void\r
+swap_node(Node* a, Node* b)\r
+{\r
+ Node c;\r
+ c = *a; *a = *b; *b = c;\r
+\r
+ if (NTYPE(a) == NT_STR) {\r
+ StrNode* sn = NSTR(a);\r
+ if (sn->capa == 0) {\r
+ int len = (int)(sn->end - sn->s);\r
+ sn->s = sn->buf;\r
+ sn->end = sn->s + len;\r
+ }\r
+ }\r
+\r
+ if (NTYPE(b) == NT_STR) {\r
+ StrNode* sn = NSTR(b);\r
+ if (sn->capa == 0) {\r
+ int len = (int)(sn->end - sn->s);\r
+ sn->s = sn->buf;\r
+ sn->end = sn->s + len;\r
+ }\r
+ }\r
+}\r
+\r
+static OnigDistance\r
+distance_add(OnigDistance d1, OnigDistance d2)\r
+{\r
+ if (d1 == ONIG_INFINITE_DISTANCE || d2 == ONIG_INFINITE_DISTANCE)\r
+ return ONIG_INFINITE_DISTANCE;\r
+ else {\r
+ if (d1 <= ONIG_INFINITE_DISTANCE - d2) return d1 + d2;\r
+ else return ONIG_INFINITE_DISTANCE;\r
+ }\r
+}\r
+\r
+static OnigDistance\r
+distance_multiply(OnigDistance d, int m)\r
+{\r
+ if (m == 0) return 0;\r
+\r
+ if (d < ONIG_INFINITE_DISTANCE / m)\r
+ return d * m;\r
+ else\r
+ return ONIG_INFINITE_DISTANCE;\r
+}\r
+\r
+static int\r
+bitset_is_empty(BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) {\r
+ if (bs[i] != 0) return 0;\r
+ }\r
+ return 1;\r
+}\r
+\r
+#ifdef ONIG_DEBUG\r
+static int\r
+bitset_on_num(BitSetRef bs)\r
+{\r
+ int i, n;\r
+\r
+ n = 0;\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (BITSET_AT(bs, i)) n++;\r
+ }\r
+ return n;\r
+}\r
+#endif\r
+\r
+extern int\r
+onig_bbuf_init(BBuf* buf, int size)\r
+{\r
+ if (size <= 0) {\r
+ size = 0;\r
+ buf->p = NULL;\r
+ }\r
+ else {\r
+ buf->p = (UChar* )xmalloc(size);\r
+ if (IS_NULL(buf->p)) return(ONIGERR_MEMORY);\r
+ }\r
+\r
+ buf->alloc = size;\r
+ buf->used = 0;\r
+ return 0;\r
+}\r
+\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+\r
+static int\r
+unset_addr_list_init(UnsetAddrList* uslist, int size)\r
+{\r
+ UnsetAddr* p;\r
+\r
+ p = (UnsetAddr* )xmalloc(sizeof(UnsetAddr)* size);\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+ uslist->num = 0;\r
+ uslist->alloc = size;\r
+ uslist->us = p;\r
+ return 0;\r
+}\r
+\r
+static void\r
+unset_addr_list_end(UnsetAddrList* uslist)\r
+{\r
+ if (IS_NOT_NULL(uslist->us))\r
+ xfree(uslist->us);\r
+}\r
+\r
+static int\r
+unset_addr_list_add(UnsetAddrList* uslist, int offset, struct _Node* node)\r
+{\r
+ UnsetAddr* p;\r
+ int size;\r
+\r
+ if (uslist->num >= uslist->alloc) {\r
+ size = uslist->alloc * 2;\r
+ p = (UnsetAddr* )xrealloc(uslist->us, sizeof(UnsetAddr) * size, sizeof(UnsetAddr) * uslist->alloc);\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+ uslist->alloc = size;\r
+ uslist->us = p;\r
+ }\r
+\r
+ uslist->us[uslist->num].offset = offset;\r
+ uslist->us[uslist->num].target = node;\r
+ uslist->num++;\r
+ return 0;\r
+}\r
+#endif /* USE_SUBEXP_CALL */\r
+\r
+\r
+static int\r
+add_opcode(regex_t* reg, int opcode)\r
+{\r
+ BBUF_ADD1(reg, ((unsigned char)opcode));\r
+ return 0;\r
+}\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+static int\r
+add_state_check_num(regex_t* reg, int num)\r
+{\r
+ StateCheckNumType n = (StateCheckNumType )num;\r
+\r
+ BBUF_ADD(reg, &n, SIZE_STATE_CHECK_NUM);\r
+ return 0;\r
+}\r
+#endif\r
+\r
+static int\r
+add_rel_addr(regex_t* reg, int addr)\r
+{\r
+ RelAddrType ra = (RelAddrType )addr;\r
+\r
+ BBUF_ADD(reg, &ra, SIZE_RELADDR);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_abs_addr(regex_t* reg, int addr)\r
+{\r
+ AbsAddrType ra = (AbsAddrType )addr;\r
+\r
+ BBUF_ADD(reg, &ra, SIZE_ABSADDR);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_length(regex_t* reg, int len)\r
+{\r
+ LengthType l = (LengthType )len;\r
+\r
+ BBUF_ADD(reg, &l, SIZE_LENGTH);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_mem_num(regex_t* reg, int num)\r
+{\r
+ MemNumType n = (MemNumType )num;\r
+\r
+ BBUF_ADD(reg, &n, SIZE_MEMNUM);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_pointer(regex_t* reg, void* addr)\r
+{\r
+ PointerType ptr = (PointerType )addr;\r
+\r
+ BBUF_ADD(reg, &ptr, SIZE_POINTER);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_option(regex_t* reg, OnigOptionType option)\r
+{\r
+ BBUF_ADD(reg, &option, SIZE_OPTION);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_opcode_rel_addr(regex_t* reg, int opcode, int addr)\r
+{\r
+ int r;\r
+\r
+ r = add_opcode(reg, opcode);\r
+ if (r) return r;\r
+ r = add_rel_addr(reg, addr);\r
+ return r;\r
+}\r
+\r
+static int\r
+add_bytes(regex_t* reg, UChar* bytes, int len)\r
+{\r
+ BBUF_ADD(reg, bytes, len);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_bitset(regex_t* reg, BitSetRef bs)\r
+{\r
+ BBUF_ADD(reg, bs, SIZE_BITSET);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_opcode_option(regex_t* reg, int opcode, OnigOptionType option)\r
+{\r
+ int r;\r
+\r
+ r = add_opcode(reg, opcode);\r
+ if (r) return r;\r
+ r = add_option(reg, option);\r
+ return r;\r
+}\r
+\r
+static int compile_length_tree(Node* node, regex_t* reg);\r
+static int compile_tree(Node* node, regex_t* reg);\r
+\r
+\r
+#define IS_NEED_STR_LEN_OP_EXACT(op) \\r
+ ((op) == OP_EXACTN || (op) == OP_EXACTMB2N ||\\r
+ (op) == OP_EXACTMB3N || (op) == OP_EXACTMBN || (op) == OP_EXACTN_IC)\r
+\r
+static int\r
+select_str_opcode(int mb_len, int str_len, int ignore_case)\r
+{\r
+ int op;\r
+\r
+ if (ignore_case) {\r
+ switch (str_len) {\r
+ case 1: op = OP_EXACT1_IC; break;\r
+ default: op = OP_EXACTN_IC; break;\r
+ }\r
+ }\r
+ else {\r
+ switch (mb_len) {\r
+ case 1:\r
+ switch (str_len) {\r
+ case 1: op = OP_EXACT1; break;\r
+ case 2: op = OP_EXACT2; break;\r
+ case 3: op = OP_EXACT3; break;\r
+ case 4: op = OP_EXACT4; break;\r
+ case 5: op = OP_EXACT5; break;\r
+ default: op = OP_EXACTN; break;\r
+ }\r
+ break;\r
+\r
+ case 2:\r
+ switch (str_len) {\r
+ case 1: op = OP_EXACTMB2N1; break;\r
+ case 2: op = OP_EXACTMB2N2; break;\r
+ case 3: op = OP_EXACTMB2N3; break;\r
+ default: op = OP_EXACTMB2N; break;\r
+ }\r
+ break;\r
+\r
+ case 3:\r
+ op = OP_EXACTMB3N;\r
+ break;\r
+\r
+ default:\r
+ op = OP_EXACTMBN;\r
+ break;\r
+ }\r
+ }\r
+ return op;\r
+}\r
+\r
+static int\r
+compile_tree_empty_check(Node* node, regex_t* reg, int empty_info)\r
+{\r
+ int r;\r
+ int saved_num_null_check = reg->num_null_check;\r
+\r
+ if (empty_info != 0) {\r
+ r = add_opcode(reg, OP_NULL_CHECK_START);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */\r
+ if (r) return r;\r
+ reg->num_null_check++;\r
+ }\r
+\r
+ r = compile_tree(node, reg);\r
+ if (r) return r;\r
+\r
+ if (empty_info != 0) {\r
+ if (empty_info == NQ_TARGET_IS_EMPTY)\r
+ r = add_opcode(reg, OP_NULL_CHECK_END);\r
+ else if (empty_info == NQ_TARGET_IS_EMPTY_MEM)\r
+ r = add_opcode(reg, OP_NULL_CHECK_END_MEMST);\r
+ else if (empty_info == NQ_TARGET_IS_EMPTY_REC)\r
+ r = add_opcode(reg, OP_NULL_CHECK_END_MEMST_PUSH);\r
+\r
+ if (r) return r;\r
+ r = add_mem_num(reg, saved_num_null_check); /* NULL CHECK ID */\r
+ }\r
+ return r;\r
+}\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+static int\r
+compile_call(CallNode* node, regex_t* reg)\r
+{\r
+ int r;\r
+\r
+ r = add_opcode(reg, OP_CALL);\r
+ if (r) return r;\r
+ r = unset_addr_list_add(node->unset_addr_list, BBUF_GET_OFFSET_POS(reg),\r
+ node->target);\r
+ if (r) return r;\r
+ r = add_abs_addr(reg, 0 /*dummy addr.*/);\r
+ return r;\r
+}\r
+#endif\r
+\r
+static int\r
+compile_tree_n_times(Node* node, int n, regex_t* reg)\r
+{\r
+ int i, r;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ r = compile_tree(node, reg);\r
+ if (r) return r;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_compile_string_length(UChar* s ARG_UNUSED, int mb_len, int str_len,\r
+ regex_t* reg ARG_UNUSED, int ignore_case)\r
+{\r
+ int len;\r
+ int op = select_str_opcode(mb_len, str_len, ignore_case);\r
+\r
+ len = SIZE_OPCODE;\r
+\r
+ if (op == OP_EXACTMBN) len += SIZE_LENGTH;\r
+ if (IS_NEED_STR_LEN_OP_EXACT(op))\r
+ len += SIZE_LENGTH;\r
+\r
+ len += mb_len * str_len;\r
+ return len;\r
+}\r
+\r
+static int\r
+add_compile_string(UChar* s, int mb_len, int str_len,\r
+ regex_t* reg, int ignore_case)\r
+{\r
+ int op = select_str_opcode(mb_len, str_len, ignore_case);\r
+ add_opcode(reg, op);\r
+\r
+ if (op == OP_EXACTMBN)\r
+ add_length(reg, mb_len);\r
+\r
+ if (IS_NEED_STR_LEN_OP_EXACT(op)) {\r
+ if (op == OP_EXACTN_IC)\r
+ add_length(reg, mb_len * str_len);\r
+ else\r
+ add_length(reg, str_len);\r
+ }\r
+\r
+ add_bytes(reg, s, mb_len * str_len);\r
+ return 0;\r
+}\r
+\r
+\r
+static int\r
+compile_length_string_node(Node* node, regex_t* reg)\r
+{\r
+ int rlen, r, len, prev_len, slen, ambig;\r
+ OnigEncoding enc = reg->enc;\r
+ UChar *p, *prev;\r
+ StrNode* sn;\r
+\r
+ sn = NSTR(node);\r
+ if (sn->end <= sn->s)\r
+ return 0;\r
+\r
+ ambig = NSTRING_IS_AMBIG(node);\r
+\r
+ p = prev = sn->s;\r
+ prev_len = enclen(enc, p);\r
+ p += prev_len;\r
+ slen = 1;\r
+ rlen = 0;\r
+\r
+ for (; p < sn->end; ) {\r
+ len = enclen(enc, p);\r
+ if (len == prev_len) {\r
+ slen++;\r
+ }\r
+ else {\r
+ r = add_compile_string_length(prev, prev_len, slen, reg, ambig);\r
+ rlen += r;\r
+ prev = p;\r
+ slen = 1;\r
+ prev_len = len;\r
+ }\r
+ p += len;\r
+ }\r
+ r = add_compile_string_length(prev, prev_len, slen, reg, ambig);\r
+ rlen += r;\r
+ return rlen;\r
+}\r
+\r
+static int\r
+compile_length_string_raw_node(StrNode* sn, regex_t* reg)\r
+{\r
+ if (sn->end <= sn->s)\r
+ return 0;\r
+\r
+ return add_compile_string_length(sn->s, 1 /* sb */, (int)(sn->end - sn->s), reg, 0);\r
+}\r
+\r
+static int\r
+compile_string_node(Node* node, regex_t* reg)\r
+{\r
+ int r, len, prev_len, slen, ambig;\r
+ OnigEncoding enc = reg->enc;\r
+ UChar *p, *prev, *end;\r
+ StrNode* sn;\r
+\r
+ sn = NSTR(node);\r
+ if (sn->end <= sn->s)\r
+ return 0;\r
+\r
+ end = sn->end;\r
+ ambig = NSTRING_IS_AMBIG(node);\r
+\r
+ p = prev = sn->s;\r
+ prev_len = enclen(enc, p);\r
+ p += prev_len;\r
+ slen = 1;\r
+\r
+ for (; p < end; ) {\r
+ len = enclen(enc, p);\r
+ if (len == prev_len) {\r
+ slen++;\r
+ }\r
+ else {\r
+ r = add_compile_string(prev, prev_len, slen, reg, ambig);\r
+ if (r) return r;\r
+\r
+ prev = p;\r
+ slen = 1;\r
+ prev_len = len;\r
+ }\r
+\r
+ p += len;\r
+ }\r
+ return add_compile_string(prev, prev_len, slen, reg, ambig);\r
+}\r
+\r
+static int\r
+compile_string_raw_node(StrNode* sn, regex_t* reg)\r
+{\r
+ if (sn->end <= sn->s)\r
+ return 0;\r
+\r
+ return add_compile_string(sn->s, 1 /* sb */, (int)(sn->end - sn->s), reg, 0);\r
+}\r
+\r
+static int\r
+add_multi_byte_cclass(BBuf* mbuf, regex_t* reg)\r
+{\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ add_length(reg, mbuf->used);\r
+ return add_bytes(reg, mbuf->p, mbuf->used);\r
+#else\r
+ int r, pad_size;\r
+ UChar* p = BBUF_GET_ADD_ADDRESS(reg) + SIZE_LENGTH;\r
+\r
+ GET_ALIGNMENT_PAD_SIZE(p, pad_size);\r
+ add_length(reg, mbuf->used + (WORD_ALIGNMENT_SIZE - 1));\r
+ if (pad_size != 0) add_bytes(reg, PadBuf, pad_size);\r
+\r
+ r = add_bytes(reg, mbuf->p, mbuf->used);\r
+\r
+ /* padding for return value from compile_length_cclass_node() to be fix. */\r
+ pad_size = (WORD_ALIGNMENT_SIZE - 1) - pad_size;\r
+ if (pad_size != 0) add_bytes(reg, PadBuf, pad_size);\r
+ return r;\r
+#endif\r
+}\r
+\r
+static int\r
+compile_length_cclass_node(CClassNode* cc, regex_t* reg)\r
+{\r
+ int len;\r
+\r
+ if (IS_NCCLASS_SHARE(cc)) {\r
+ len = SIZE_OPCODE + SIZE_POINTER;\r
+ return len;\r
+ }\r
+\r
+ if (IS_NULL(cc->mbuf)) {\r
+ len = SIZE_OPCODE + SIZE_BITSET;\r
+ }\r
+ else {\r
+ if (ONIGENC_MBC_MINLEN(reg->enc) > 1 || bitset_is_empty(cc->bs)) {\r
+ len = SIZE_OPCODE;\r
+ }\r
+ else {\r
+ len = SIZE_OPCODE + SIZE_BITSET;\r
+ }\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ len += SIZE_LENGTH + cc->mbuf->used;\r
+#else\r
+ len += SIZE_LENGTH + cc->mbuf->used + (WORD_ALIGNMENT_SIZE - 1);\r
+#endif\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+static int\r
+compile_cclass_node(CClassNode* cc, regex_t* reg)\r
+{\r
+ int r;\r
+\r
+ if (IS_NCCLASS_SHARE(cc)) {\r
+ add_opcode(reg, OP_CCLASS_NODE);\r
+ r = add_pointer(reg, cc);\r
+ return r;\r
+ }\r
+\r
+ if (IS_NULL(cc->mbuf)) {\r
+ if (IS_NCCLASS_NOT(cc))\r
+ add_opcode(reg, OP_CCLASS_NOT);\r
+ else\r
+ add_opcode(reg, OP_CCLASS);\r
+\r
+ r = add_bitset(reg, cc->bs);\r
+ }\r
+ else {\r
+ if (ONIGENC_MBC_MINLEN(reg->enc) > 1 || bitset_is_empty(cc->bs)) {\r
+ if (IS_NCCLASS_NOT(cc))\r
+ add_opcode(reg, OP_CCLASS_MB_NOT);\r
+ else\r
+ add_opcode(reg, OP_CCLASS_MB);\r
+\r
+ r = add_multi_byte_cclass(cc->mbuf, reg);\r
+ }\r
+ else {\r
+ if (IS_NCCLASS_NOT(cc))\r
+ add_opcode(reg, OP_CCLASS_MIX_NOT);\r
+ else\r
+ add_opcode(reg, OP_CCLASS_MIX);\r
+\r
+ r = add_bitset(reg, cc->bs);\r
+ if (r) return r;\r
+ r = add_multi_byte_cclass(cc->mbuf, reg);\r
+ }\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+entry_repeat_range(regex_t* reg, int id, int lower, int upper)\r
+{\r
+#define REPEAT_RANGE_ALLOC 4\r
+\r
+ OnigRepeatRange* p;\r
+\r
+ if (reg->repeat_range_alloc == 0) {\r
+ p = (OnigRepeatRange* )xmalloc(sizeof(OnigRepeatRange) * REPEAT_RANGE_ALLOC);\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+ reg->repeat_range = p;\r
+ reg->repeat_range_alloc = REPEAT_RANGE_ALLOC;\r
+ }\r
+ else if (reg->repeat_range_alloc <= id) {\r
+ int n;\r
+ n = reg->repeat_range_alloc + REPEAT_RANGE_ALLOC;\r
+ p = (OnigRepeatRange* )xrealloc(reg->repeat_range,\r
+ sizeof(OnigRepeatRange) * n,\r
+ sizeof(OnigRepeatRange) * reg->repeat_range_alloc);\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+ reg->repeat_range = p;\r
+ reg->repeat_range_alloc = n;\r
+ }\r
+ else {\r
+ p = reg->repeat_range;\r
+ }\r
+\r
+ p[id].lower = lower;\r
+ p[id].upper = (IS_REPEAT_INFINITE(upper) ? 0x7fffffff : upper);\r
+ return 0;\r
+}\r
+\r
+static int\r
+compile_range_repeat_node(QtfrNode* qn, int target_len, int empty_info,\r
+ regex_t* reg)\r
+{\r
+ int r;\r
+ int num_repeat = reg->num_repeat;\r
+\r
+ r = add_opcode(reg, qn->greedy ? OP_REPEAT : OP_REPEAT_NG);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */\r
+ reg->num_repeat++;\r
+ if (r) return r;\r
+ r = add_rel_addr(reg, target_len + SIZE_OP_REPEAT_INC);\r
+ if (r) return r;\r
+\r
+ r = entry_repeat_range(reg, num_repeat, qn->lower, qn->upper);\r
+ if (r) return r;\r
+\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+\r
+ if (\r
+#ifdef USE_SUBEXP_CALL\r
+ reg->num_call > 0 ||\r
+#endif\r
+ IS_QUANTIFIER_IN_REPEAT(qn)) {\r
+ r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC_SG : OP_REPEAT_INC_NG_SG);\r
+ }\r
+ else {\r
+ r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC : OP_REPEAT_INC_NG);\r
+ }\r
+ if (r) return r;\r
+ r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */\r
+ return r;\r
+}\r
+\r
+static int\r
+is_anychar_star_quantifier(QtfrNode* qn)\r
+{\r
+ if (qn->greedy && IS_REPEAT_INFINITE(qn->upper) &&\r
+ NTYPE(qn->target) == NT_CANY)\r
+ return 1;\r
+ else\r
+ return 0;\r
+}\r
+\r
+#define QUANTIFIER_EXPAND_LIMIT_SIZE 50\r
+#define CKN_ON (ckn > 0)\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+\r
+static int\r
+compile_length_quantifier_node(QtfrNode* qn, regex_t* reg)\r
+{\r
+ int len, mod_tlen, cklen;\r
+ int ckn;\r
+ int infinite = IS_REPEAT_INFINITE(qn->upper);\r
+ int empty_info = qn->target_empty_info;\r
+ int tlen = compile_length_tree(qn->target, reg);\r
+\r
+ if (tlen < 0) return tlen;\r
+\r
+ ckn = ((reg->num_comb_exp_check > 0) ? qn->comb_exp_check_num : 0);\r
+\r
+ cklen = (CKN_ON ? SIZE_STATE_CHECK_NUM: 0);\r
+\r
+ /* anychar repeat */\r
+ if (NTYPE(qn->target) == NT_CANY) {\r
+ if (qn->greedy && infinite) {\r
+ if (IS_NOT_NULL(qn->next_head_exact) && !CKN_ON)\r
+ return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower + cklen;\r
+ else\r
+ return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower + cklen;\r
+ }\r
+ }\r
+\r
+ if (empty_info != 0)\r
+ mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\r
+ else\r
+ mod_tlen = tlen;\r
+\r
+ if (infinite && qn->lower <= 1) {\r
+ if (qn->greedy) {\r
+ if (qn->lower == 1)\r
+ len = SIZE_OP_JUMP;\r
+ else\r
+ len = 0;\r
+\r
+ len += SIZE_OP_PUSH + cklen + mod_tlen + SIZE_OP_JUMP;\r
+ }\r
+ else {\r
+ if (qn->lower == 0)\r
+ len = SIZE_OP_JUMP;\r
+ else\r
+ len = 0;\r
+\r
+ len += mod_tlen + SIZE_OP_PUSH + cklen;\r
+ }\r
+ }\r
+ else if (qn->upper == 0) {\r
+ if (qn->is_refered != 0) /* /(?<n>..){0}/ */\r
+ len = SIZE_OP_JUMP + tlen;\r
+ else\r
+ len = 0;\r
+ }\r
+ else if (qn->upper == 1 && qn->greedy) {\r
+ if (qn->lower == 0) {\r
+ if (CKN_ON) {\r
+ len = SIZE_OP_STATE_CHECK_PUSH + tlen;\r
+ }\r
+ else {\r
+ len = SIZE_OP_PUSH + tlen;\r
+ }\r
+ }\r
+ else {\r
+ len = tlen;\r
+ }\r
+ }\r
+ else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\r
+ len = SIZE_OP_PUSH + cklen + SIZE_OP_JUMP + tlen;\r
+ }\r
+ else {\r
+ len = SIZE_OP_REPEAT_INC\r
+ + mod_tlen + SIZE_OPCODE + SIZE_RELADDR + SIZE_MEMNUM;\r
+ if (CKN_ON)\r
+ len += SIZE_OP_STATE_CHECK;\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+static int\r
+compile_quantifier_node(QtfrNode* qn, regex_t* reg)\r
+{\r
+ int r, mod_tlen;\r
+ int ckn;\r
+ int infinite = IS_REPEAT_INFINITE(qn->upper);\r
+ int empty_info = qn->target_empty_info;\r
+ int tlen = compile_length_tree(qn->target, reg);\r
+\r
+ if (tlen < 0) return tlen;\r
+\r
+ ckn = ((reg->num_comb_exp_check > 0) ? qn->comb_exp_check_num : 0);\r
+\r
+ if (is_anychar_star_quantifier(qn)) {\r
+ r = compile_tree_n_times(qn->target, qn->lower, reg);\r
+ if (r) return r;\r
+ if (IS_NOT_NULL(qn->next_head_exact) && !CKN_ON) {\r
+ if (IS_MULTILINE(reg->options))\r
+ r = add_opcode(reg, OP_ANYCHAR_ML_STAR_PEEK_NEXT);\r
+ else\r
+ r = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);\r
+ if (r) return r;\r
+ if (CKN_ON) {\r
+ r = add_state_check_num(reg, ckn);\r
+ if (r) return r;\r
+ }\r
+\r
+ return add_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\r
+ }\r
+ else {\r
+ if (IS_MULTILINE(reg->options)) {\r
+ r = add_opcode(reg, (CKN_ON ?\r
+ OP_STATE_CHECK_ANYCHAR_ML_STAR\r
+ : OP_ANYCHAR_ML_STAR));\r
+ }\r
+ else {\r
+ r = add_opcode(reg, (CKN_ON ?\r
+ OP_STATE_CHECK_ANYCHAR_STAR\r
+ : OP_ANYCHAR_STAR));\r
+ }\r
+ if (r) return r;\r
+ if (CKN_ON)\r
+ r = add_state_check_num(reg, ckn);\r
+\r
+ return r;\r
+ }\r
+ }\r
+\r
+ if (empty_info != 0)\r
+ mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\r
+ else\r
+ mod_tlen = tlen;\r
+\r
+ if (infinite && qn->lower <= 1) {\r
+ if (qn->greedy) {\r
+ if (qn->lower == 1) {\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ (CKN_ON ? SIZE_OP_STATE_CHECK_PUSH : SIZE_OP_PUSH));\r
+ if (r) return r;\r
+ }\r
+\r
+ if (CKN_ON) {\r
+ r = add_opcode(reg, OP_STATE_CHECK_PUSH);\r
+ if (r) return r;\r
+ r = add_state_check_num(reg, ckn);\r
+ if (r) return r;\r
+ r = add_rel_addr(reg, mod_tlen + SIZE_OP_JUMP);\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);\r
+ }\r
+ if (r) return r;\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ -(mod_tlen + (int )SIZE_OP_JUMP\r
+ + (int )(CKN_ON ? SIZE_OP_STATE_CHECK_PUSH : SIZE_OP_PUSH)));\r
+ }\r
+ else {\r
+ if (qn->lower == 0) {\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);\r
+ if (r) return r;\r
+ }\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ if (CKN_ON) {\r
+ r = add_opcode(reg, OP_STATE_CHECK_PUSH_OR_JUMP);\r
+ if (r) return r;\r
+ r = add_state_check_num(reg, ckn);\r
+ if (r) return r;\r
+ r = add_rel_addr(reg,\r
+ -(mod_tlen + (int )SIZE_OP_STATE_CHECK_PUSH_OR_JUMP));\r
+ }\r
+ else\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + (int )SIZE_OP_PUSH));\r
+ }\r
+ }\r
+ else if (qn->upper == 0) {\r
+ if (qn->is_refered != 0) { /* /(?<n>..){0}/ */\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ }\r
+ else\r
+ r = 0;\r
+ }\r
+ else if (qn->upper == 1 && qn->greedy) {\r
+ if (qn->lower == 0) {\r
+ if (CKN_ON) {\r
+ r = add_opcode(reg, OP_STATE_CHECK_PUSH);\r
+ if (r) return r;\r
+ r = add_state_check_num(reg, ckn);\r
+ if (r) return r;\r
+ r = add_rel_addr(reg, tlen);\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, tlen);\r
+ }\r
+ if (r) return r;\r
+ }\r
+\r
+ r = compile_tree(qn->target, reg);\r
+ }\r
+ else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\r
+ if (CKN_ON) {\r
+ r = add_opcode(reg, OP_STATE_CHECK_PUSH);\r
+ if (r) return r;\r
+ r = add_state_check_num(reg, ckn);\r
+ if (r) return r;\r
+ r = add_rel_addr(reg, SIZE_OP_JUMP);\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, SIZE_OP_JUMP);\r
+ }\r
+\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ }\r
+ else {\r
+ r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);\r
+ if (CKN_ON) {\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_STATE_CHECK);\r
+ if (r) return r;\r
+ r = add_state_check_num(reg, ckn);\r
+ }\r
+ }\r
+ return r;\r
+}\r
+\r
+#else /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+static int\r
+compile_length_quantifier_node(QtfrNode* qn, regex_t* reg)\r
+{\r
+ int len, mod_tlen;\r
+ int infinite = IS_REPEAT_INFINITE(qn->upper);\r
+ int empty_info = qn->target_empty_info;\r
+ int tlen = compile_length_tree(qn->target, reg);\r
+\r
+ if (tlen < 0) return tlen;\r
+\r
+ /* anychar repeat */\r
+ if (NTYPE(qn->target) == NT_CANY) {\r
+ if (qn->greedy && infinite) {\r
+ if (IS_NOT_NULL(qn->next_head_exact))\r
+ return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower;\r
+ else\r
+ return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower;\r
+ }\r
+ }\r
+\r
+ if (empty_info != 0)\r
+ mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\r
+ else\r
+ mod_tlen = tlen;\r
+\r
+ if (infinite &&\r
+ (qn->lower <= 1 || tlen * qn->lower <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\r
+ if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {\r
+ len = SIZE_OP_JUMP;\r
+ }\r
+ else {\r
+ len = tlen * qn->lower;\r
+ }\r
+\r
+ if (qn->greedy) {\r
+ if (IS_NOT_NULL(qn->head_exact))\r
+ len += SIZE_OP_PUSH_OR_JUMP_EXACT1 + mod_tlen + SIZE_OP_JUMP;\r
+ else if (IS_NOT_NULL(qn->next_head_exact))\r
+ len += SIZE_OP_PUSH_IF_PEEK_NEXT + mod_tlen + SIZE_OP_JUMP;\r
+ else\r
+ len += SIZE_OP_PUSH + mod_tlen + SIZE_OP_JUMP;\r
+ }\r
+ else\r
+ len += SIZE_OP_JUMP + mod_tlen + SIZE_OP_PUSH;\r
+ }\r
+ else if (qn->upper == 0 && qn->is_refered != 0) { /* /(?<n>..){0}/ */\r
+ len = SIZE_OP_JUMP + tlen;\r
+ }\r
+ else if (!infinite && qn->greedy &&\r
+ (qn->upper == 1 || (tlen + SIZE_OP_PUSH) * qn->upper\r
+ <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\r
+ len = tlen * qn->lower;\r
+ len += (SIZE_OP_PUSH + tlen) * (qn->upper - qn->lower);\r
+ }\r
+ else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\r
+ len = SIZE_OP_PUSH + SIZE_OP_JUMP + tlen;\r
+ }\r
+ else {\r
+ len = SIZE_OP_REPEAT_INC\r
+ + mod_tlen + SIZE_OPCODE + SIZE_RELADDR + SIZE_MEMNUM;\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+static int\r
+compile_quantifier_node(QtfrNode* qn, regex_t* reg)\r
+{\r
+ int i, r, mod_tlen;\r
+ int infinite = IS_REPEAT_INFINITE(qn->upper);\r
+ int empty_info = qn->target_empty_info;\r
+ int tlen = compile_length_tree(qn->target, reg);\r
+\r
+ if (tlen < 0) return tlen;\r
+\r
+ if (is_anychar_star_quantifier(qn)) {\r
+ r = compile_tree_n_times(qn->target, qn->lower, reg);\r
+ if (r) return r;\r
+ if (IS_NOT_NULL(qn->next_head_exact)) {\r
+ if (IS_MULTILINE(reg->options))\r
+ r = add_opcode(reg, OP_ANYCHAR_ML_STAR_PEEK_NEXT);\r
+ else\r
+ r = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);\r
+ if (r) return r;\r
+ return add_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\r
+ }\r
+ else {\r
+ if (IS_MULTILINE(reg->options))\r
+ return add_opcode(reg, OP_ANYCHAR_ML_STAR);\r
+ else\r
+ return add_opcode(reg, OP_ANYCHAR_STAR);\r
+ }\r
+ }\r
+\r
+ if (empty_info != 0)\r
+ mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\r
+ else\r
+ mod_tlen = tlen;\r
+\r
+ if (infinite &&\r
+ (qn->lower <= 1 || tlen * qn->lower <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\r
+ if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {\r
+ if (qn->greedy) {\r
+ if (IS_NOT_NULL(qn->head_exact))\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_OR_JUMP_EXACT1);\r
+ else if (IS_NOT_NULL(qn->next_head_exact))\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_IF_PEEK_NEXT);\r
+ else\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH);\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_JUMP);\r
+ }\r
+ if (r) return r;\r
+ }\r
+ else {\r
+ r = compile_tree_n_times(qn->target, qn->lower, reg);\r
+ if (r) return r;\r
+ }\r
+\r
+ if (qn->greedy) {\r
+ if (IS_NOT_NULL(qn->head_exact)) {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH_OR_JUMP_EXACT1,\r
+ mod_tlen + SIZE_OP_JUMP);\r
+ if (r) return r;\r
+ add_bytes(reg, NSTR(qn->head_exact)->s, 1);\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_OR_JUMP_EXACT1));\r
+ }\r
+ else if (IS_NOT_NULL(qn->next_head_exact)) {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH_IF_PEEK_NEXT,\r
+ mod_tlen + SIZE_OP_JUMP);\r
+ if (r) return r;\r
+ add_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_IF_PEEK_NEXT));\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);\r
+ if (r) return r;\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH));\r
+ }\r
+ }\r
+ else {\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);\r
+ if (r) return r;\r
+ r = compile_tree_empty_check(qn->target, reg, empty_info);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + (int )SIZE_OP_PUSH));\r
+ }\r
+ }\r
+ else if (qn->upper == 0 && qn->is_refered != 0) { /* /(?<n>..){0}/ */\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ }\r
+ else if (!infinite && qn->greedy &&\r
+ (qn->upper == 1 || (tlen + SIZE_OP_PUSH) * qn->upper\r
+ <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\r
+ int n = qn->upper - qn->lower;\r
+\r
+ r = compile_tree_n_times(qn->target, qn->lower, reg);\r
+ if (r) return r;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH,\r
+ (n - i) * tlen + (n - i - 1) * SIZE_OP_PUSH);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ if (r) return r;\r
+ }\r
+ }\r
+ else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, SIZE_OP_JUMP);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ }\r
+ else {\r
+ r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);\r
+ }\r
+ return r;\r
+}\r
+#endif /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+static int\r
+compile_length_option_node(EncloseNode* node, regex_t* reg)\r
+{\r
+ int tlen;\r
+ OnigOptionType prev = reg->options;\r
+\r
+ reg->options = node->option;\r
+ tlen = compile_length_tree(node->target, reg);\r
+ reg->options = prev;\r
+\r
+ if (tlen < 0) return tlen;\r
+\r
+ if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\r
+ return SIZE_OP_SET_OPTION_PUSH + SIZE_OP_SET_OPTION + SIZE_OP_FAIL\r
+ + tlen + SIZE_OP_SET_OPTION;\r
+ }\r
+ else\r
+ return tlen;\r
+}\r
+\r
+static int\r
+compile_option_node(EncloseNode* node, regex_t* reg)\r
+{\r
+ int r;\r
+ OnigOptionType prev = reg->options;\r
+\r
+ if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\r
+ r = add_opcode_option(reg, OP_SET_OPTION_PUSH, node->option);\r
+ if (r) return r;\r
+ r = add_opcode_option(reg, OP_SET_OPTION, prev);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_FAIL);\r
+ if (r) return r;\r
+ }\r
+\r
+ reg->options = node->option;\r
+ r = compile_tree(node->target, reg);\r
+ reg->options = prev;\r
+\r
+ if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\r
+ if (r) return r;\r
+ r = add_opcode_option(reg, OP_SET_OPTION, prev);\r
+ }\r
+ return r;\r
+}\r
+\r
+static int\r
+compile_length_enclose_node(EncloseNode* node, regex_t* reg)\r
+{\r
+ int len;\r
+ int tlen;\r
+\r
+ if (node->type == ENCLOSE_OPTION)\r
+ return compile_length_option_node(node, reg);\r
+\r
+ if (node->target) {\r
+ tlen = compile_length_tree(node->target, reg);\r
+ if (tlen < 0) return tlen;\r
+ }\r
+ else\r
+ tlen = 0;\r
+\r
+ switch (node->type) {\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_CALLED(node)) {\r
+ len = SIZE_OP_MEMORY_START_PUSH + tlen\r
+ + SIZE_OP_CALL + SIZE_OP_JUMP + SIZE_OP_RETURN;\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\r
+ len += (IS_ENCLOSE_RECURSION(node)\r
+ ? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);\r
+ else\r
+ len += (IS_ENCLOSE_RECURSION(node)\r
+ ? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END);\r
+ }\r
+ else\r
+#endif\r
+ {\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))\r
+ len = SIZE_OP_MEMORY_START_PUSH;\r
+ else\r
+ len = SIZE_OP_MEMORY_START;\r
+\r
+ len += tlen + (BIT_STATUS_AT(reg->bt_mem_end, node->regnum)\r
+ ? SIZE_OP_MEMORY_END_PUSH : SIZE_OP_MEMORY_END);\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ if (IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(node)) {\r
+ QtfrNode* qn = NQTFR(node->target);\r
+ tlen = compile_length_tree(qn->target, reg);\r
+ if (tlen < 0) return tlen;\r
+\r
+ len = tlen * qn->lower\r
+ + SIZE_OP_PUSH + tlen + SIZE_OP_POP + SIZE_OP_JUMP;\r
+ }\r
+ else {\r
+ len = SIZE_OP_PUSH_STOP_BT + tlen + SIZE_OP_POP_STOP_BT;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+static int get_char_length_tree(Node* node, regex_t* reg, int* len);\r
+\r
+static int\r
+compile_enclose_node(EncloseNode* node, regex_t* reg)\r
+{\r
+ int r, len;\r
+\r
+ if (node->type == ENCLOSE_OPTION)\r
+ return compile_option_node(node, reg);\r
+\r
+ switch (node->type) {\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_CALLED(node)) {\r
+ r = add_opcode(reg, OP_CALL);\r
+ if (r) return r;\r
+ node->call_addr = BBUF_GET_OFFSET_POS(reg) + SIZE_ABSADDR + SIZE_OP_JUMP;\r
+ node->state |= NST_ADDR_FIXED;\r
+ r = add_abs_addr(reg, (int )node->call_addr);\r
+ if (r) return r;\r
+ len = compile_length_tree(node->target, reg);\r
+ len += (SIZE_OP_MEMORY_START_PUSH + SIZE_OP_RETURN);\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\r
+ len += (IS_ENCLOSE_RECURSION(node)\r
+ ? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);\r
+ else\r
+ len += (IS_ENCLOSE_RECURSION(node)\r
+ ? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END);\r
+\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, len);\r
+ if (r) return r;\r
+ }\r
+#endif\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))\r
+ r = add_opcode(reg, OP_MEMORY_START_PUSH);\r
+ else\r
+ r = add_opcode(reg, OP_MEMORY_START);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, node->regnum);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ if (r) return r;\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_CALLED(node)) {\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\r
+ r = add_opcode(reg, (IS_ENCLOSE_RECURSION(node)\r
+ ? OP_MEMORY_END_PUSH_REC : OP_MEMORY_END_PUSH));\r
+ else\r
+ r = add_opcode(reg, (IS_ENCLOSE_RECURSION(node)\r
+ ? OP_MEMORY_END_REC : OP_MEMORY_END));\r
+\r
+ if (r) return r;\r
+ r = add_mem_num(reg, node->regnum);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_RETURN);\r
+ }\r
+ else\r
+#endif\r
+ {\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\r
+ r = add_opcode(reg, OP_MEMORY_END_PUSH);\r
+ else\r
+ r = add_opcode(reg, OP_MEMORY_END);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, node->regnum);\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ if (IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(node)) {\r
+ QtfrNode* qn = NQTFR(node->target);\r
+ r = compile_tree_n_times(qn->target, qn->lower, reg);\r
+ if (r) return r;\r
+\r
+ len = compile_length_tree(qn->target, reg);\r
+ if (len < 0) return len;\r
+\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_POP + SIZE_OP_JUMP);\r
+ if (r) return r;\r
+ r = compile_tree(qn->target, reg);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_POP);\r
+ if (r) return r;\r
+ r = add_opcode_rel_addr(reg, OP_JUMP,\r
+ -((int )SIZE_OP_PUSH + len + (int )SIZE_OP_POP + (int )SIZE_OP_JUMP));\r
+ }\r
+ else {\r
+ r = add_opcode(reg, OP_PUSH_STOP_BT);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_POP_STOP_BT);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+compile_length_anchor_node(AnchorNode* node, regex_t* reg)\r
+{\r
+ int len;\r
+ int tlen = 0;\r
+\r
+ if (node->target) {\r
+ tlen = compile_length_tree(node->target, reg);\r
+ if (tlen < 0) return tlen;\r
+ }\r
+\r
+ switch (node->type) {\r
+ case ANCHOR_PREC_READ:\r
+ len = SIZE_OP_PUSH_POS + tlen + SIZE_OP_POP_POS;\r
+ break;\r
+ case ANCHOR_PREC_READ_NOT:\r
+ len = SIZE_OP_PUSH_POS_NOT + tlen + SIZE_OP_FAIL_POS;\r
+ break;\r
+ case ANCHOR_LOOK_BEHIND:\r
+ len = SIZE_OP_LOOK_BEHIND + tlen;\r
+ break;\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ len = SIZE_OP_PUSH_LOOK_BEHIND_NOT + tlen + SIZE_OP_FAIL_LOOK_BEHIND_NOT;\r
+ break;\r
+\r
+ default:\r
+ len = SIZE_OPCODE;\r
+ break;\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+static int\r
+compile_anchor_node(AnchorNode* node, regex_t* reg)\r
+{\r
+ int r, len;\r
+\r
+ switch (node->type) {\r
+ case ANCHOR_BEGIN_BUF: r = add_opcode(reg, OP_BEGIN_BUF); break;\r
+ case ANCHOR_END_BUF: r = add_opcode(reg, OP_END_BUF); break;\r
+ case ANCHOR_BEGIN_LINE: r = add_opcode(reg, OP_BEGIN_LINE); break;\r
+ case ANCHOR_END_LINE: r = add_opcode(reg, OP_END_LINE); break;\r
+ case ANCHOR_SEMI_END_BUF: r = add_opcode(reg, OP_SEMI_END_BUF); break;\r
+ case ANCHOR_BEGIN_POSITION: r = add_opcode(reg, OP_BEGIN_POSITION); break;\r
+\r
+ case ANCHOR_WORD_BOUND: r = add_opcode(reg, OP_WORD_BOUND); break;\r
+ case ANCHOR_NOT_WORD_BOUND: r = add_opcode(reg, OP_NOT_WORD_BOUND); break;\r
+#ifdef USE_WORD_BEGIN_END\r
+ case ANCHOR_WORD_BEGIN: r = add_opcode(reg, OP_WORD_BEGIN); break;\r
+ case ANCHOR_WORD_END: r = add_opcode(reg, OP_WORD_END); break;\r
+#endif\r
+\r
+ case ANCHOR_PREC_READ:\r
+ r = add_opcode(reg, OP_PUSH_POS);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_POP_POS);\r
+ break;\r
+\r
+ case ANCHOR_PREC_READ_NOT:\r
+ len = compile_length_tree(node->target, reg);\r
+ if (len < 0) return len;\r
+ r = add_opcode_rel_addr(reg, OP_PUSH_POS_NOT, len + SIZE_OP_FAIL_POS);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_FAIL_POS);\r
+ break;\r
+\r
+ case ANCHOR_LOOK_BEHIND:\r
+ {\r
+ int n;\r
+ r = add_opcode(reg, OP_LOOK_BEHIND);\r
+ if (r) return r;\r
+ if (node->char_len < 0) {\r
+ r = get_char_length_tree(node->target, reg, &n);\r
+ if (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ }\r
+ else\r
+ n = node->char_len;\r
+ r = add_length(reg, n);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ }\r
+ break;\r
+\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ {\r
+ int n;\r
+ len = compile_length_tree(node->target, reg);\r
+ r = add_opcode_rel_addr(reg, OP_PUSH_LOOK_BEHIND_NOT,\r
+ len + SIZE_OP_FAIL_LOOK_BEHIND_NOT);\r
+ if (r) return r;\r
+ if (node->char_len < 0) {\r
+ r = get_char_length_tree(node->target, reg, &n);\r
+ if (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ }\r
+ else\r
+ n = node->char_len;\r
+ r = add_length(reg, n);\r
+ if (r) return r;\r
+ r = compile_tree(node->target, reg);\r
+ if (r) return r;\r
+ r = add_opcode(reg, OP_FAIL_LOOK_BEHIND_NOT);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+compile_length_tree(Node* node, regex_t* reg)\r
+{\r
+ int len, type, r;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ len = 0;\r
+ do {\r
+ r = compile_length_tree(NCAR(node), reg);\r
+ if (r < 0) return r;\r
+ len += r;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ r = len;\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ int n;\r
+\r
+ n = r = 0;\r
+ do {\r
+ r += compile_length_tree(NCAR(node), reg);\r
+ n++;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ r += (SIZE_OP_PUSH + SIZE_OP_JUMP) * (n - 1);\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ if (NSTRING_IS_RAW(node))\r
+ r = compile_length_string_raw_node(NSTR(node), reg);\r
+ else\r
+ r = compile_length_string_node(node, reg);\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ r = compile_length_cclass_node(NCCLASS(node), reg);\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ case NT_CANY:\r
+ r = SIZE_OPCODE;\r
+ break;\r
+\r
+ case NT_BREF:\r
+ {\r
+ BRefNode* br = NBREF(node);\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ if (IS_BACKREF_NEST_LEVEL(br)) {\r
+ r = SIZE_OPCODE + SIZE_OPTION + SIZE_LENGTH +\r
+ SIZE_LENGTH + (SIZE_MEMNUM * br->back_num);\r
+ }\r
+ else\r
+#endif\r
+ if (br->back_num == 1) {\r
+ r = ((!IS_IGNORECASE(reg->options) && br->back_static[0] <= 2)\r
+ ? SIZE_OPCODE : (SIZE_OPCODE + SIZE_MEMNUM));\r
+ }\r
+ else {\r
+ r = SIZE_OPCODE + SIZE_LENGTH + (SIZE_MEMNUM * br->back_num);\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ r = SIZE_OP_CALL;\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ r = compile_length_quantifier_node(NQTFR(node), reg);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ r = compile_length_enclose_node(NENCLOSE(node), reg);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ r = compile_length_anchor_node(NANCHOR(node), reg);\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+compile_tree(Node* node, regex_t* reg)\r
+{\r
+ int n, type, len, pos, r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ do {\r
+ r = compile_tree(NCAR(node), reg);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ Node* x = node;\r
+ len = 0;\r
+ do {\r
+ len += compile_length_tree(NCAR(x), reg);\r
+ if (NCDR(x) != NULL) {\r
+ len += SIZE_OP_PUSH + SIZE_OP_JUMP;\r
+ }\r
+ } while (IS_NOT_NULL(x = NCDR(x)));\r
+ pos = reg->used + len; /* goal position */\r
+\r
+ do {\r
+ len = compile_length_tree(NCAR(node), reg);\r
+ if (IS_NOT_NULL(NCDR(node))) {\r
+ r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_JUMP);\r
+ if (r) break;\r
+ }\r
+ r = compile_tree(NCAR(node), reg);\r
+ if (r) break;\r
+ if (IS_NOT_NULL(NCDR(node))) {\r
+ len = pos - (reg->used + SIZE_OP_JUMP);\r
+ r = add_opcode_rel_addr(reg, OP_JUMP, len);\r
+ if (r) break;\r
+ }\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ if (NSTRING_IS_RAW(node))\r
+ r = compile_string_raw_node(NSTR(node), reg);\r
+ else\r
+ r = compile_string_node(node, reg);\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ r = compile_cclass_node(NCCLASS(node), reg);\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ {\r
+ int op;\r
+\r
+ switch (NCTYPE(node)->ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (NCTYPE(node)->not != 0) op = OP_NOT_WORD;\r
+ else op = OP_WORD;\r
+ break;\r
+ default:\r
+ return ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+ r = add_opcode(reg, op);\r
+ }\r
+ break;\r
+\r
+ case NT_CANY:\r
+ if (IS_MULTILINE(reg->options))\r
+ r = add_opcode(reg, OP_ANYCHAR_ML);\r
+ else\r
+ r = add_opcode(reg, OP_ANYCHAR);\r
+ break;\r
+\r
+ case NT_BREF:\r
+ {\r
+ BRefNode* br = NBREF(node);\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ if (IS_BACKREF_NEST_LEVEL(br)) {\r
+ r = add_opcode(reg, OP_BACKREF_WITH_LEVEL);\r
+ if (r) return r;\r
+ r = add_option(reg, (reg->options & ONIG_OPTION_IGNORECASE));\r
+ if (r) return r;\r
+ r = add_length(reg, br->nest_level);\r
+ if (r) return r;\r
+\r
+ goto add_bacref_mems;\r
+ }\r
+ else\r
+#endif\r
+ if (br->back_num == 1) {\r
+ n = br->back_static[0];\r
+ if (IS_IGNORECASE(reg->options)) {\r
+ r = add_opcode(reg, OP_BACKREFN_IC);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, n);\r
+ }\r
+ else {\r
+ switch (n) {\r
+ case 1: r = add_opcode(reg, OP_BACKREF1); break;\r
+ case 2: r = add_opcode(reg, OP_BACKREF2); break;\r
+ default:\r
+ r = add_opcode(reg, OP_BACKREFN);\r
+ if (r) return r;\r
+ r = add_mem_num(reg, n);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ int i;\r
+ int* p;\r
+\r
+ if (IS_IGNORECASE(reg->options)) {\r
+ r = add_opcode(reg, OP_BACKREF_MULTI_IC);\r
+ }\r
+ else {\r
+ r = add_opcode(reg, OP_BACKREF_MULTI);\r
+ }\r
+ if (r) return r;\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ add_bacref_mems:\r
+#endif\r
+ r = add_length(reg, br->back_num);\r
+ if (r) return r;\r
+ p = BACKREFS_P(br);\r
+ for (i = br->back_num - 1; i >= 0; i--) {\r
+ r = add_mem_num(reg, p[i]);\r
+ if (r) return r;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ r = compile_call(NCALL(node), reg);\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ r = compile_quantifier_node(NQTFR(node), reg);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ r = compile_enclose_node(NENCLOSE(node), reg);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ r = compile_anchor_node(NANCHOR(node), reg);\r
+ break;\r
+\r
+ default:\r
+#ifdef ONIG_DEBUG\r
+ fprintf(stderr, "compile_tree: undefined node type %d\n", NTYPE(node));\r
+#endif\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+#ifdef USE_NAMED_GROUP\r
+\r
+static int\r
+noname_disable_map(Node** plink, GroupNumRemap* map, int* counter)\r
+{\r
+ int r = 0;\r
+ Node* node = *plink;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r = noname_disable_map(&(NCAR(node)), map, counter);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ Node** ptarget = &(NQTFR(node)->target);\r
+ Node* old = *ptarget;\r
+ r = noname_disable_map(ptarget, map, counter);\r
+ if (*ptarget != old && NTYPE(*ptarget) == NT_QTFR) {\r
+ onig_reduce_nested_quantifier(node, *ptarget);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ if (en->type == ENCLOSE_MEMORY) {\r
+ if (IS_ENCLOSE_NAMED_GROUP(en)) {\r
+ (*counter)++;\r
+ map[en->regnum].new_val = *counter;\r
+ en->regnum = *counter;\r
+ r = noname_disable_map(&(en->target), map, counter);\r
+ }\r
+ else {\r
+ *plink = en->target;\r
+ en->target = NULL_NODE;\r
+ onig_node_free(node);\r
+ r = noname_disable_map(plink, map, counter);\r
+ }\r
+ }\r
+ else\r
+ r = noname_disable_map(&(en->target), map, counter);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+renumber_node_backref(Node* node, GroupNumRemap* map)\r
+{\r
+ int i, pos, n, old_num;\r
+ int *backs;\r
+ BRefNode* bn = NBREF(node);\r
+\r
+ if (! IS_BACKREF_NAME_REF(bn))\r
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\r
+\r
+ old_num = bn->back_num;\r
+ if (IS_NULL(bn->back_dynamic))\r
+ backs = bn->back_static;\r
+ else\r
+ backs = bn->back_dynamic;\r
+\r
+ for (i = 0, pos = 0; i < old_num; i++) {\r
+ n = map[backs[i]].new_val;\r
+ if (n > 0) {\r
+ backs[pos] = n;\r
+ pos++;\r
+ }\r
+ }\r
+\r
+ bn->back_num = pos;\r
+ return 0;\r
+}\r
+\r
+static int\r
+renumber_by_map(Node* node, GroupNumRemap* map)\r
+{\r
+ int r = 0;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r = renumber_by_map(NCAR(node), map);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+ case NT_QTFR:\r
+ r = renumber_by_map(NQTFR(node)->target, map);\r
+ break;\r
+ case NT_ENCLOSE:\r
+ r = renumber_by_map(NENCLOSE(node)->target, map);\r
+ break;\r
+\r
+ case NT_BREF:\r
+ r = renumber_node_backref(node, map);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+numbered_ref_check(Node* node)\r
+{\r
+ int r = 0;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r = numbered_ref_check(NCAR(node));\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+ case NT_QTFR:\r
+ r = numbered_ref_check(NQTFR(node)->target);\r
+ break;\r
+ case NT_ENCLOSE:\r
+ r = numbered_ref_check(NENCLOSE(node)->target);\r
+ break;\r
+\r
+ case NT_BREF:\r
+ if (! IS_BACKREF_NAME_REF(NBREF(node)))\r
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+disable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env)\r
+{\r
+ int r, i, pos, counter;\r
+ int Result;\r
+ BitStatusType loc;\r
+ GroupNumRemap* map;\r
+\r
+ map = (GroupNumRemap* )xmalloc(sizeof(GroupNumRemap) * (env->num_mem + 1));\r
+ CHECK_NULL_RETURN_MEMERR(map);\r
+ for (i = 1; i <= env->num_mem; i++) {\r
+ map[i].new_val = 0;\r
+ }\r
+ counter = 0;\r
+ r = noname_disable_map(root, map, &counter);\r
+ if (r != 0) return r;\r
+\r
+ r = renumber_by_map(*root, map);\r
+ if (r != 0) return r;\r
+\r
+ for (i = 1, pos = 1; i <= env->num_mem; i++) {\r
+ if (map[i].new_val > 0) {\r
+ SCANENV_MEM_NODES(env)[pos] = SCANENV_MEM_NODES(env)[i];\r
+ pos++;\r
+ }\r
+ }\r
+\r
+ loc = env->capture_history;\r
+ BIT_STATUS_CLEAR(env->capture_history);\r
+ for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {\r
+ if (BIT_STATUS_AT(loc, i)) {\r
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, map[i].new_val);\r
+ }\r
+ }\r
+\r
+ env->num_mem = env->num_named;\r
+ reg->num_mem = env->num_named;\r
+\r
+ Result = onig_renumber_name_table(reg, map);\r
+ xfree(map);\r
+ return Result;\r
+}\r
+#endif /* USE_NAMED_GROUP */\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+static int\r
+unset_addr_list_fix(UnsetAddrList* uslist, regex_t* reg)\r
+{\r
+ int i, offset;\r
+ EncloseNode* en;\r
+ AbsAddrType addr;\r
+\r
+ for (i = 0; i < uslist->num; i++) {\r
+ en = NENCLOSE(uslist->us[i].target);\r
+ if (! IS_ENCLOSE_ADDR_FIXED(en)) return ONIGERR_PARSER_BUG;\r
+ addr = en->call_addr;\r
+ offset = uslist->us[i].offset;\r
+\r
+ BBUF_WRITE(reg, offset, &addr, SIZE_ABSADDR);\r
+ }\r
+ return 0;\r
+}\r
+#endif\r
+\r
+#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\r
+static int\r
+quantifiers_memory_node_info(Node* node)\r
+{\r
+ int r = 0;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ {\r
+ int v;\r
+ do {\r
+ v = quantifiers_memory_node_info(NCAR(node));\r
+ if (v > r) r = v;\r
+ } while (v >= 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (IS_CALL_RECURSION(NCALL(node))) {\r
+ return NQ_TARGET_IS_EMPTY_REC; /* tiny version */\r
+ }\r
+ else\r
+ r = quantifiers_memory_node_info(NCALL(node)->target);\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ {\r
+ QtfrNode* qn = NQTFR(node);\r
+ if (qn->upper != 0) {\r
+ r = quantifiers_memory_node_info(qn->target);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ switch (en->type) {\r
+ case ENCLOSE_MEMORY:\r
+ return NQ_TARGET_IS_EMPTY_MEM;\r
+ break;\r
+\r
+ case ENCLOSE_OPTION:\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ r = quantifiers_memory_node_info(en->target);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_BREF:\r
+ case NT_STR:\r
+ case NT_CTYPE:\r
+ case NT_CCLASS:\r
+ case NT_CANY:\r
+ case NT_ANCHOR:\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+#endif /* USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT */\r
+\r
+static int\r
+get_min_match_length(Node* node, OnigDistance *min, ScanEnv* env)\r
+{\r
+ OnigDistance tmin;\r
+ int r = 0;\r
+\r
+ *min = 0;\r
+ switch (NTYPE(node)) {\r
+ case NT_BREF:\r
+ {\r
+ int i;\r
+ int* backs;\r
+ Node** nodes = SCANENV_MEM_NODES(env);\r
+ BRefNode* br = NBREF(node);\r
+ if (br->state & NST_RECURSION) break;\r
+\r
+ backs = BACKREFS_P(br);\r
+ if (backs[0] > env->num_mem) return ONIGERR_INVALID_BACKREF;\r
+ r = get_min_match_length(nodes[backs[0]], min, env);\r
+ if (r != 0) break;\r
+ for (i = 1; i < br->back_num; i++) {\r
+ if (backs[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;\r
+ r = get_min_match_length(nodes[backs[i]], &tmin, env);\r
+ if (r != 0) break;\r
+ if (*min > tmin) *min = tmin;\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (IS_CALL_RECURSION(NCALL(node))) {\r
+ EncloseNode* en = NENCLOSE(NCALL(node)->target);\r
+ if (IS_ENCLOSE_MIN_FIXED(en))\r
+ *min = en->min_len;\r
+ }\r
+ else\r
+ r = get_min_match_length(NCALL(node)->target, min, env);\r
+ break;\r
+#endif\r
+\r
+ case NT_LIST:\r
+ do {\r
+ r = get_min_match_length(NCAR(node), &tmin, env);\r
+ if (r == 0) *min += tmin;\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ Node *x, *y;\r
+ y = node;\r
+ do {\r
+ x = NCAR(y);\r
+ r = get_min_match_length(x, &tmin, env);\r
+ if (r != 0) break;\r
+ if (y == node) *min = tmin;\r
+ else if (*min > tmin) *min = tmin;\r
+ } while (r == 0 && IS_NOT_NULL(y = NCDR(y)));\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* sn = NSTR(node);\r
+ *min = (OnigDistance)(sn->end - sn->s);\r
+ }\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ *min = 1;\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ case NT_CANY:\r
+ *min = 1;\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ QtfrNode* qn = NQTFR(node);\r
+\r
+ if (qn->lower > 0) {\r
+ r = get_min_match_length(qn->target, min, env);\r
+ if (r == 0)\r
+ *min = distance_multiply(*min, qn->lower);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ switch (en->type) {\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_MIN_FIXED(en))\r
+ *min = en->min_len;\r
+ else {\r
+ r = get_min_match_length(en->target, min, env);\r
+ if (r == 0) {\r
+ en->min_len = *min;\r
+ SET_ENCLOSE_STATUS(node, NST_MIN_FIXED);\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+ case ENCLOSE_OPTION:\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ r = get_min_match_length(en->target, min, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+get_max_match_length(Node* node, OnigDistance *max, ScanEnv* env)\r
+{\r
+ OnigDistance tmax;\r
+ int r = 0;\r
+\r
+ *max = 0;\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ do {\r
+ r = get_max_match_length(NCAR(node), &tmax, env);\r
+ if (r == 0)\r
+ *max = distance_add(*max, tmax);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_ALT:\r
+ do {\r
+ r = get_max_match_length(NCAR(node), &tmax, env);\r
+ if (r == 0 && *max < tmax) *max = tmax;\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* sn = NSTR(node);\r
+ *max = (OnigDistance)(sn->end - sn->s);\r
+ }\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ case NT_CANY:\r
+ *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\r
+ break;\r
+\r
+ case NT_BREF:\r
+ {\r
+ int i;\r
+ int* backs;\r
+ Node** nodes = SCANENV_MEM_NODES(env);\r
+ BRefNode* br = NBREF(node);\r
+ if (br->state & NST_RECURSION) {\r
+ *max = ONIG_INFINITE_DISTANCE;\r
+ break;\r
+ }\r
+ backs = BACKREFS_P(br);\r
+ for (i = 0; i < br->back_num; i++) {\r
+ if (backs[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;\r
+ r = get_max_match_length(nodes[backs[i]], &tmax, env);\r
+ if (r != 0) break;\r
+ if (*max < tmax) *max = tmax;\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (! IS_CALL_RECURSION(NCALL(node)))\r
+ r = get_max_match_length(NCALL(node)->target, max, env);\r
+ else\r
+ *max = ONIG_INFINITE_DISTANCE;\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ {\r
+ QtfrNode* qn = NQTFR(node);\r
+\r
+ if (qn->upper != 0) {\r
+ r = get_max_match_length(qn->target, max, env);\r
+ if (r == 0 && *max != 0) {\r
+ if (! IS_REPEAT_INFINITE(qn->upper))\r
+ *max = distance_multiply(*max, qn->upper);\r
+ else\r
+ *max = ONIG_INFINITE_DISTANCE;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ switch (en->type) {\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_MAX_FIXED(en))\r
+ *max = en->max_len;\r
+ else {\r
+ r = get_max_match_length(en->target, max, env);\r
+ if (r == 0) {\r
+ en->max_len = *max;\r
+ SET_ENCLOSE_STATUS(node, NST_MAX_FIXED);\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+ case ENCLOSE_OPTION:\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ r = get_max_match_length(en->target, max, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+#define GET_CHAR_LEN_VARLEN -1\r
+#define GET_CHAR_LEN_TOP_ALT_VARLEN -2\r
+\r
+/* fixed size pattern node only */\r
+static int\r
+get_char_length_tree1(Node* node, regex_t* reg, int* len, int level)\r
+{\r
+ int tlen;\r
+ int r = 0;\r
+\r
+ level++;\r
+ *len = 0;\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ do {\r
+ r = get_char_length_tree1(NCAR(node), reg, &tlen, level);\r
+ if (r == 0)\r
+ *len = distance_add(*len, tlen);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ int tlen2;\r
+ int varlen = 0;\r
+\r
+ r = get_char_length_tree1(NCAR(node), reg, &tlen, level);\r
+ while (r == 0 && IS_NOT_NULL(node = NCDR(node))) {\r
+ r = get_char_length_tree1(NCAR(node), reg, &tlen2, level);\r
+ if (r == 0) {\r
+ if (tlen != tlen2)\r
+ varlen = 1;\r
+ }\r
+ }\r
+ if (r == 0) {\r
+ if (varlen != 0) {\r
+ if (level == 1)\r
+ r = GET_CHAR_LEN_TOP_ALT_VARLEN;\r
+ else\r
+ r = GET_CHAR_LEN_VARLEN;\r
+ }\r
+ else\r
+ *len = tlen;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* sn = NSTR(node);\r
+ UChar *s = sn->s;\r
+ while (s < sn->end) {\r
+ s += enclen(reg->enc, s);\r
+ (*len)++;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ QtfrNode* qn = NQTFR(node);\r
+ if (qn->lower == qn->upper) {\r
+ r = get_char_length_tree1(qn->target, reg, &tlen, level);\r
+ if (r == 0)\r
+ *len = distance_multiply(tlen, qn->lower);\r
+ }\r
+ else\r
+ r = GET_CHAR_LEN_VARLEN;\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (! IS_CALL_RECURSION(NCALL(node)))\r
+ r = get_char_length_tree1(NCALL(node)->target, reg, len, level);\r
+ else\r
+ r = GET_CHAR_LEN_VARLEN;\r
+ break;\r
+#endif\r
+\r
+ case NT_CTYPE:\r
+ *len = 1;\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ case NT_CANY:\r
+ *len = 1;\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ switch (en->type) {\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (IS_ENCLOSE_CLEN_FIXED(en))\r
+ *len = en->char_len;\r
+ else {\r
+ r = get_char_length_tree1(en->target, reg, len, level);\r
+ if (r == 0) {\r
+ en->char_len = *len;\r
+ SET_ENCLOSE_STATUS(node, NST_CLEN_FIXED);\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+ case ENCLOSE_OPTION:\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ r = get_char_length_tree1(en->target, reg, len, level);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ break;\r
+\r
+ default:\r
+ r = GET_CHAR_LEN_VARLEN;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+get_char_length_tree(Node* node, regex_t* reg, int* len)\r
+{\r
+ return get_char_length_tree1(node, reg, len, 0);\r
+}\r
+\r
+/* x is not included y ==> 1 : 0 */\r
+static int\r
+is_not_included(Node* x, Node* y, regex_t* reg)\r
+{\r
+ int i, len;\r
+ OnigCodePoint code;\r
+ UChar *p;\r
+ int ytype;\r
+\r
+ retry:\r
+ ytype = NTYPE(y);\r
+ switch (NTYPE(x)) {\r
+ case NT_CTYPE:\r
+ {\r
+ switch (ytype) {\r
+ case NT_CTYPE:\r
+ if (NCTYPE(y)->ctype == NCTYPE(x)->ctype &&\r
+ NCTYPE(y)->not != NCTYPE(x)->not)\r
+ return 1;\r
+ else\r
+ return 0;\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ swap:\r
+ {\r
+ Node* tmp;\r
+ tmp = x; x = y; y = tmp;\r
+ goto retry;\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ goto swap;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ {\r
+ CClassNode* xc = NCCLASS(x);\r
+ switch (ytype) {\r
+ case NT_CTYPE:\r
+ switch (NCTYPE(y)->ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (NCTYPE(y)->not == 0) {\r
+ if (IS_NULL(xc->mbuf) && !IS_NCCLASS_NOT(xc)) {\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (BITSET_AT(xc->bs, i)) {\r
+ if (IS_CODE_SB_WORD(reg->enc, i)) return 0;\r
+ }\r
+ }\r
+ return 1;\r
+ }\r
+ return 0;\r
+ }\r
+ else {\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (! IS_CODE_SB_WORD(reg->enc, i)) {\r
+ if (!IS_NCCLASS_NOT(xc)) {\r
+ if (BITSET_AT(xc->bs, i))\r
+ return 0;\r
+ }\r
+ else {\r
+ if (! BITSET_AT(xc->bs, i))\r
+ return 0;\r
+ }\r
+ }\r
+ }\r
+ return 1;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ {\r
+ int v;\r
+ CClassNode* yc = NCCLASS(y);\r
+\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ v = BITSET_AT(xc->bs, i);\r
+ if ((v != 0 && !IS_NCCLASS_NOT(xc)) ||\r
+ (v == 0 && IS_NCCLASS_NOT(xc))) {\r
+ v = BITSET_AT(yc->bs, i);\r
+ if ((v != 0 && !IS_NCCLASS_NOT(yc)) ||\r
+ (v == 0 && IS_NCCLASS_NOT(yc)))\r
+ return 0;\r
+ }\r
+ }\r
+ if ((IS_NULL(xc->mbuf) && !IS_NCCLASS_NOT(xc)) ||\r
+ (IS_NULL(yc->mbuf) && !IS_NCCLASS_NOT(yc)))\r
+ return 1;\r
+ return 0;\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ goto swap;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* xs = NSTR(x);\r
+ if (NSTRING_LEN(x) == 0)\r
+ break;\r
+\r
+ //c = *(xs->s);\r
+ switch (ytype) {\r
+ case NT_CTYPE:\r
+ switch (NCTYPE(y)->ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (ONIGENC_IS_MBC_WORD(reg->enc, xs->s, xs->end))\r
+ return NCTYPE(y)->not;\r
+ else\r
+ return !(NCTYPE(y)->not);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ {\r
+ CClassNode* cc = NCCLASS(y);\r
+\r
+ code = ONIGENC_MBC_TO_CODE(reg->enc, xs->s,\r
+ xs->s + ONIGENC_MBC_MAXLEN(reg->enc));\r
+ return (onig_is_code_in_cc(reg->enc, code, cc) != 0 ? 0 : 1);\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ UChar *q;\r
+ StrNode* ys = NSTR(y);\r
+ len = NSTRING_LEN(x);\r
+ if (len > NSTRING_LEN(y)) len = NSTRING_LEN(y);\r
+ if (NSTRING_IS_AMBIG(x) || NSTRING_IS_AMBIG(y)) {\r
+ /* tiny version */\r
+ return 0;\r
+ }\r
+ else {\r
+ for (i = 0, p = ys->s, q = xs->s; i < len; i++, p++, q++) {\r
+ if (*p != *q) return 1;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static Node*\r
+get_head_value_node(Node* node, int exact, regex_t* reg)\r
+{\r
+ Node* n = NULL_NODE;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_BREF:\r
+ case NT_ALT:\r
+ case NT_CANY:\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+#endif\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ case NT_CCLASS:\r
+ if (exact == 0) {\r
+ n = node;\r
+ }\r
+ break;\r
+\r
+ case NT_LIST:\r
+ n = get_head_value_node(NCAR(node), exact, reg);\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* sn = NSTR(node);\r
+\r
+ if (sn->end <= sn->s)\r
+ break;\r
+\r
+ if (exact != 0 &&\r
+ !NSTRING_IS_RAW(node) && IS_IGNORECASE(reg->options)) {\r
+ }\r
+ else {\r
+ n = node;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ QtfrNode* qn = NQTFR(node);\r
+ if (qn->lower > 0) {\r
+ if (IS_NOT_NULL(qn->head_exact))\r
+ n = qn->head_exact;\r
+ else\r
+ n = get_head_value_node(qn->target, exact, reg);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ switch (en->type) {\r
+ case ENCLOSE_OPTION:\r
+ {\r
+ OnigOptionType options = reg->options;\r
+\r
+ reg->options = NENCLOSE(node)->option;\r
+ n = get_head_value_node(NENCLOSE(node)->target, exact, reg);\r
+ reg->options = options;\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_MEMORY:\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ n = get_head_value_node(en->target, exact, reg);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ if (NANCHOR(node)->type == ANCHOR_PREC_READ)\r
+ n = get_head_value_node(NANCHOR(node)->target, exact, reg);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return n;\r
+}\r
+\r
+static int\r
+check_type_tree(Node* node, int type_mask, int enclose_mask, int anchor_mask)\r
+{\r
+ int type, r = 0;\r
+\r
+ type = NTYPE(node);\r
+ if ((NTYPE2BIT(type) & type_mask) == 0)\r
+ return 1;\r
+\r
+ switch (type) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r = check_type_tree(NCAR(node), type_mask, enclose_mask,\r
+ anchor_mask);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = check_type_tree(NQTFR(node)->target, type_mask, enclose_mask,\r
+ anchor_mask);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ if ((en->type & enclose_mask) == 0)\r
+ return 1;\r
+\r
+ r = check_type_tree(en->target, type_mask, enclose_mask, anchor_mask);\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ type = NANCHOR(node)->type;\r
+ if ((type & anchor_mask) == 0)\r
+ return 1;\r
+\r
+ if (NANCHOR(node)->target)\r
+ r = check_type_tree(NANCHOR(node)->target,\r
+ type_mask, enclose_mask, anchor_mask);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ return r;\r
+}\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+\r
+#define RECURSION_EXIST 1\r
+#define RECURSION_INFINITE 2\r
+\r
+static int\r
+subexp_inf_recursive_check(Node* node, ScanEnv* env, int head)\r
+{\r
+ int type;\r
+ int r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ {\r
+ Node *x;\r
+ OnigDistance min;\r
+ int ret;\r
+\r
+ x = node;\r
+ do {\r
+ ret = subexp_inf_recursive_check(NCAR(x), env, head);\r
+ if (ret < 0 || ret == RECURSION_INFINITE) return ret;\r
+ r |= ret;\r
+ if (head) {\r
+ ret = get_min_match_length(NCAR(x), &min, env);\r
+ if (ret != 0) return ret;\r
+ if (min != 0) head = 0;\r
+ }\r
+ } while (IS_NOT_NULL(x = NCDR(x)));\r
+ }\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ int ret;\r
+ r = RECURSION_EXIST;\r
+ do {\r
+ ret = subexp_inf_recursive_check(NCAR(node), env, head);\r
+ if (ret < 0 || ret == RECURSION_INFINITE) return ret;\r
+ r &= ret;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = subexp_inf_recursive_check(NQTFR(node)->target, env, head);\r
+ if (r == RECURSION_EXIST) {\r
+ if (NQTFR(node)->lower == 0) r = 0;\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND:\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ r = subexp_inf_recursive_check(an->target, env, head);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CALL:\r
+ r = subexp_inf_recursive_check(NCALL(node)->target, env, head);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ if (IS_ENCLOSE_MARK2(NENCLOSE(node)))\r
+ return 0;\r
+ else if (IS_ENCLOSE_MARK1(NENCLOSE(node)))\r
+ return (head == 0 ? RECURSION_EXIST : RECURSION_INFINITE);\r
+ else {\r
+ SET_ENCLOSE_STATUS(node, NST_MARK2);\r
+ r = subexp_inf_recursive_check(NENCLOSE(node)->target, env, head);\r
+ CLEAR_ENCLOSE_STATUS(node, NST_MARK2);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+subexp_inf_recursive_check_trav(Node* node, ScanEnv* env)\r
+{\r
+ int type;\r
+ int r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r = subexp_inf_recursive_check_trav(NCAR(node), env);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = subexp_inf_recursive_check_trav(NQTFR(node)->target, env);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND:\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ r = subexp_inf_recursive_check_trav(an->target, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+\r
+ if (IS_ENCLOSE_RECURSION(en)) {\r
+ SET_ENCLOSE_STATUS(node, NST_MARK1);\r
+ r = subexp_inf_recursive_check(en->target, env, 1);\r
+ if (r > 0) return ONIGERR_NEVER_ENDING_RECURSION;\r
+ CLEAR_ENCLOSE_STATUS(node, NST_MARK1);\r
+ }\r
+ r = subexp_inf_recursive_check_trav(en->target, env);\r
+ }\r
+\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+subexp_recursive_check(Node* node)\r
+{\r
+ int r = 0;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ do {\r
+ r |= subexp_recursive_check(NCAR(node));\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = subexp_recursive_check(NQTFR(node)->target);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND:\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ r = subexp_recursive_check(an->target);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CALL:\r
+ r = subexp_recursive_check(NCALL(node)->target);\r
+ if (r != 0) SET_CALL_RECURSION(node);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ if (IS_ENCLOSE_MARK2(NENCLOSE(node)))\r
+ return 0;\r
+ else if (IS_ENCLOSE_MARK1(NENCLOSE(node)))\r
+ return 1; /* recursion */\r
+ else {\r
+ SET_ENCLOSE_STATUS(node, NST_MARK2);\r
+ r = subexp_recursive_check(NENCLOSE(node)->target);\r
+ CLEAR_ENCLOSE_STATUS(node, NST_MARK2);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+\r
+static int\r
+subexp_recursive_check_trav(Node* node, ScanEnv* env)\r
+{\r
+#define FOUND_CALLED_NODE 1\r
+\r
+ int type;\r
+ int r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ {\r
+ int ret;\r
+ do {\r
+ ret = subexp_recursive_check_trav(NCAR(node), env);\r
+ if (ret == FOUND_CALLED_NODE) r = FOUND_CALLED_NODE;\r
+ else if (ret < 0) return ret;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = subexp_recursive_check_trav(NQTFR(node)->target, env);\r
+ if (NQTFR(node)->upper == 0) {\r
+ if (r == FOUND_CALLED_NODE)\r
+ NQTFR(node)->is_refered = 1;\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND:\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ r = subexp_recursive_check_trav(an->target, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+\r
+ if (! IS_ENCLOSE_RECURSION(en)) {\r
+ if (IS_ENCLOSE_CALLED(en)) {\r
+ SET_ENCLOSE_STATUS(node, NST_MARK1);\r
+ r = subexp_recursive_check(en->target);\r
+ if (r != 0) SET_ENCLOSE_STATUS(node, NST_RECURSION);\r
+ CLEAR_ENCLOSE_STATUS(node, NST_MARK1);\r
+ }\r
+ }\r
+ r = subexp_recursive_check_trav(en->target, env);\r
+ if (IS_ENCLOSE_CALLED(en))\r
+ r |= FOUND_CALLED_NODE;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+setup_subexp_call(Node* node, ScanEnv* env)\r
+{\r
+ int type;\r
+ int r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ do {\r
+ r = setup_subexp_call(NCAR(node), env);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_ALT:\r
+ do {\r
+ r = setup_subexp_call(NCAR(node), env);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ r = setup_subexp_call(NQTFR(node)->target, env);\r
+ break;\r
+ case NT_ENCLOSE:\r
+ r = setup_subexp_call(NENCLOSE(node)->target, env);\r
+ break;\r
+\r
+ case NT_CALL:\r
+ {\r
+ CallNode* cn = NCALL(node);\r
+ Node** nodes = SCANENV_MEM_NODES(env);\r
+\r
+ if (cn->group_num != 0) {\r
+ int gnum = cn->group_num;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ if (env->num_named > 0 &&\r
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\r
+ !ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_CAPTURE_GROUP)) {\r
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\r
+ }\r
+#endif\r
+ if (gnum > env->num_mem) {\r
+ onig_scan_env_set_error_string(env,\r
+ ONIGERR_UNDEFINED_GROUP_REFERENCE, cn->name, cn->name_end);\r
+ return ONIGERR_UNDEFINED_GROUP_REFERENCE;\r
+ }\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ set_call_attr:\r
+#endif\r
+ cn->target = nodes[cn->group_num];\r
+ if (IS_NULL(cn->target)) {\r
+ onig_scan_env_set_error_string(env,\r
+ ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);\r
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;\r
+ }\r
+ SET_ENCLOSE_STATUS(cn->target, NST_CALLED);\r
+ BIT_STATUS_ON_AT(env->bt_mem_start, cn->group_num);\r
+ cn->unset_addr_list = env->unset_addr_list;\r
+ }\r
+#ifdef USE_NAMED_GROUP\r
+ else {\r
+ int *refs;\r
+\r
+ int n = onig_name_to_group_numbers(env->reg, cn->name, cn->name_end,\r
+ &refs);\r
+ if (n <= 0) {\r
+ onig_scan_env_set_error_string(env,\r
+ ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);\r
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;\r
+ }\r
+ else if (n > 1) {\r
+ onig_scan_env_set_error_string(env,\r
+ ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL, cn->name, cn->name_end);\r
+ return ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL;\r
+ }\r
+ else {\r
+ cn->group_num = refs[0];\r
+ goto set_call_attr;\r
+ }\r
+ }\r
+#endif\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND:\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ r = setup_subexp_call(an->target, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+#endif\r
+\r
+/* divide different length alternatives in look-behind.\r
+ (?<=A|B) ==> (?<=A)|(?<=B)\r
+ (?<!A|B) ==> (?<!A)(?<!B)\r
+*/\r
+static int\r
+divide_look_behind_alternatives(Node* node)\r
+{\r
+ Node *head, *np, *insert_node;\r
+ AnchorNode* an = NANCHOR(node);\r
+ int anc_type = an->type;\r
+\r
+ head = an->target;\r
+ np = NCAR(head);\r
+ swap_node(node, head);\r
+ NCAR(node) = head;\r
+ NANCHOR(head)->target = np;\r
+\r
+ np = node;\r
+ while ((np = NCDR(np)) != NULL_NODE) {\r
+ insert_node = onig_node_new_anchor(anc_type);\r
+ CHECK_NULL_RETURN_MEMERR(insert_node);\r
+ NANCHOR(insert_node)->target = NCAR(np);\r
+ NCAR(np) = insert_node;\r
+ }\r
+\r
+ if (anc_type == ANCHOR_LOOK_BEHIND_NOT) {\r
+ np = node;\r
+ do {\r
+ SET_NTYPE(np, NT_LIST); /* alt -> list */\r
+ } while ((np = NCDR(np)) != NULL_NODE);\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+setup_look_behind(Node* node, regex_t* reg, ScanEnv* env)\r
+{\r
+ int r, len;\r
+ AnchorNode* an = NANCHOR(node);\r
+\r
+ r = get_char_length_tree(an->target, reg, &len);\r
+ if (r == 0)\r
+ an->char_len = len;\r
+ else if (r == GET_CHAR_LEN_VARLEN)\r
+ r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ else if (r == GET_CHAR_LEN_TOP_ALT_VARLEN) {\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND))\r
+ r = divide_look_behind_alternatives(node);\r
+ else\r
+ r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+next_setup(Node* node, Node* next_node, regex_t* reg)\r
+{\r
+ int type;\r
+\r
+ retry:\r
+ type = NTYPE(node);\r
+ if (type == NT_QTFR) {\r
+ QtfrNode* qn = NQTFR(node);\r
+ if (qn->greedy && IS_REPEAT_INFINITE(qn->upper)) {\r
+#ifdef USE_QTFR_PEEK_NEXT\r
+ Node* n = get_head_value_node(next_node, 1, reg);\r
+ /* '\0': for UTF-16BE etc... */\r
+ if (IS_NOT_NULL(n) && NSTR(n)->s[0] != '\0') {\r
+ qn->next_head_exact = n;\r
+ }\r
+#endif\r
+ /* automatic posseivation a*b ==> (?>a*)b */\r
+ if (qn->lower <= 1) {\r
+ int ttype = NTYPE(qn->target);\r
+ if (IS_NODE_TYPE_SIMPLE(ttype)) {\r
+ Node *x, *y;\r
+ x = get_head_value_node(qn->target, 0, reg);\r
+ if (IS_NOT_NULL(x)) {\r
+ y = get_head_value_node(next_node, 0, reg);\r
+ if (IS_NOT_NULL(y) && is_not_included(x, y, reg)) {\r
+ Node* en = onig_node_new_enclose(ENCLOSE_STOP_BACKTRACK);\r
+ CHECK_NULL_RETURN_MEMERR(en);\r
+ SET_ENCLOSE_STATUS(en, NST_STOP_BT_SIMPLE_REPEAT);\r
+ swap_node(node, en);\r
+ NENCLOSE(node)->target = en;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else if (type == NT_ENCLOSE) {\r
+ EncloseNode* en = NENCLOSE(node);\r
+ if (en->type == ENCLOSE_MEMORY) {\r
+ node = en->target;\r
+ goto retry;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+\r
+static int\r
+update_string_node_case_fold(regex_t* reg, Node *node)\r
+{\r
+ UChar *p, *end, buf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+ UChar *sbuf, *ebuf, *sp;\r
+ int r, i, len, sbuf_size;\r
+ StrNode* sn = NSTR(node);\r
+\r
+ end = sn->end;\r
+ sbuf_size = (int)(end - sn->s) * 2;\r
+ sbuf = (UChar* )xmalloc(sbuf_size);\r
+ CHECK_NULL_RETURN_MEMERR(sbuf);\r
+ ebuf = sbuf + sbuf_size;\r
+\r
+ sp = sbuf;\r
+ p = sn->s;\r
+ while (p < end) {\r
+ len = ONIGENC_MBC_CASE_FOLD(reg->enc, reg->case_fold_flag, &p, end, buf);\r
+ for (i = 0; i < len; i++) {\r
+ if (sp >= ebuf) {\r
+ sbuf = (UChar* )xrealloc(sbuf, sbuf_size * 2, sbuf_size);\r
+ CHECK_NULL_RETURN_MEMERR(sbuf);\r
+ sp = sbuf + sbuf_size;\r
+ sbuf_size *= 2;\r
+ ebuf = sbuf + sbuf_size;\r
+ }\r
+\r
+ *sp++ = buf[i];\r
+ }\r
+ }\r
+\r
+ r = onig_node_str_set(node, sbuf, sp);\r
+ if (r != 0) {\r
+ xfree(sbuf);\r
+ return r;\r
+ }\r
+\r
+ xfree(sbuf);\r
+ return 0;\r
+}\r
+\r
+static int\r
+expand_case_fold_make_rem_string(Node** rnode, UChar *s, UChar *end,\r
+ regex_t* reg)\r
+{\r
+ int r;\r
+ Node *node;\r
+\r
+ node = onig_node_new_str(s, end);\r
+ if (IS_NULL(node)) return ONIGERR_MEMORY;\r
+\r
+ r = update_string_node_case_fold(reg, node);\r
+ if (r != 0) {\r
+ onig_node_free(node);\r
+ return r;\r
+ }\r
+\r
+ NSTRING_SET_AMBIG(node);\r
+ NSTRING_SET_DONT_GET_OPT_INFO(node);\r
+ *rnode = node;\r
+ return 0;\r
+}\r
+\r
+static int\r
+expand_case_fold_string_alt(int item_num, OnigCaseFoldCodeItem items[],\r
+ UChar *p, int slen, UChar *end,\r
+ regex_t* reg, Node **rnode)\r
+{\r
+ int r, i, j, len, varlen;\r
+ Node *anode, *var_anode, *snode, *xnode, *an;\r
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\r
+\r
+ *rnode = var_anode = NULL_NODE;\r
+\r
+ varlen = 0;\r
+ for (i = 0; i < item_num; i++) {\r
+ if (items[i].byte_len != slen) {\r
+ varlen = 1;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (varlen != 0) {\r
+ *rnode = var_anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\r
+ if (IS_NULL(var_anode)) return ONIGERR_MEMORY;\r
+\r
+ xnode = onig_node_new_list(NULL, NULL);\r
+ if (IS_NULL(xnode)) goto mem_err;\r
+ NCAR(var_anode) = xnode;\r
+\r
+ anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\r
+ if (IS_NULL(anode)) goto mem_err;\r
+ NCAR(xnode) = anode;\r
+ }\r
+ else {\r
+ *rnode = anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\r
+ if (IS_NULL(anode)) return ONIGERR_MEMORY;\r
+ }\r
+\r
+ snode = onig_node_new_str(p, p + slen);\r
+ if (IS_NULL(snode)) goto mem_err;\r
+\r
+ NCAR(anode) = snode;\r
+\r
+ for (i = 0; i < item_num; i++) {\r
+ snode = onig_node_new_str(NULL, NULL);\r
+ if (IS_NULL(snode)) goto mem_err;\r
+ \r
+ for (j = 0; j < items[i].code_len; j++) {\r
+ len = ONIGENC_CODE_TO_MBC(reg->enc, items[i].code[j], buf);\r
+ if (len < 0) {\r
+ r = len;\r
+ goto mem_err2;\r
+ }\r
+\r
+ r = onig_node_str_cat(snode, buf, buf + len);\r
+ if (r != 0) goto mem_err2;\r
+ }\r
+\r
+ an = onig_node_new_alt(NULL_NODE, NULL_NODE);\r
+ if (IS_NULL(an)) {\r
+ goto mem_err2;\r
+ }\r
+\r
+ if (items[i].byte_len != slen) {\r
+ Node *rem;\r
+ UChar *q = p + items[i].byte_len;\r
+\r
+ if (q < end) {\r
+ r = expand_case_fold_make_rem_string(&rem, q, end, reg);\r
+ if (r != 0) {\r
+ onig_node_free(an);\r
+ goto mem_err2;\r
+ }\r
+\r
+ xnode = onig_node_list_add(NULL_NODE, snode);\r
+ if (IS_NULL(xnode)) {\r
+ onig_node_free(an);\r
+ onig_node_free(rem);\r
+ goto mem_err2;\r
+ }\r
+ if (IS_NULL(onig_node_list_add(xnode, rem))) {\r
+ onig_node_free(an);\r
+ onig_node_free(xnode);\r
+ onig_node_free(rem);\r
+ goto mem_err;\r
+ }\r
+\r
+ NCAR(an) = xnode;\r
+ }\r
+ else {\r
+ NCAR(an) = snode;\r
+ }\r
+\r
+ NCDR(var_anode) = an;\r
+ var_anode = an;\r
+ }\r
+ else {\r
+ NCAR(an) = snode;\r
+ NCDR(anode) = an;\r
+ anode = an;\r
+ }\r
+ }\r
+\r
+ return varlen;\r
+\r
+ mem_err2:\r
+ onig_node_free(snode);\r
+\r
+ mem_err:\r
+ onig_node_free(*rnode);\r
+\r
+ return ONIGERR_MEMORY;\r
+}\r
+\r
+static int\r
+expand_case_fold_string(Node* node, regex_t* reg)\r
+{\r
+#define THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION 8\r
+\r
+ int r, n, len, alt_num;\r
+ UChar *start, *end, *p;\r
+ Node *top_root, *root, *snode, *prev_node;\r
+ OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\r
+ StrNode* sn = NSTR(node);\r
+\r
+ if (NSTRING_IS_AMBIG(node)) return 0;\r
+\r
+ start = sn->s;\r
+ end = sn->end;\r
+ if (start >= end) return 0;\r
+\r
+ r = 0;\r
+ top_root = root = prev_node = snode = NULL_NODE;\r
+ alt_num = 1;\r
+ p = start;\r
+ while (p < end) {\r
+ n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(reg->enc, reg->case_fold_flag,\r
+ p, end, items);\r
+ if (n < 0) {\r
+ r = n;\r
+ goto err;\r
+ }\r
+\r
+ len = enclen(reg->enc, p);\r
+\r
+ if (n == 0) {\r
+ if (IS_NULL(snode)) {\r
+ if (IS_NULL(root) && IS_NOT_NULL(prev_node)) {\r
+ top_root = root = onig_node_list_add(NULL_NODE, prev_node);\r
+ if (IS_NULL(root)) {\r
+ onig_node_free(prev_node);\r
+ goto mem_err;\r
+ }\r
+ }\r
+\r
+ prev_node = snode = onig_node_new_str(NULL, NULL);\r
+ if (IS_NULL(snode)) goto mem_err;\r
+ if (IS_NOT_NULL(root)) {\r
+ if (IS_NULL(onig_node_list_add(root, snode))) {\r
+ onig_node_free(snode);\r
+ goto mem_err;\r
+ }\r
+ }\r
+ }\r
+\r
+ r = onig_node_str_cat(snode, p, p + len);\r
+ if (r != 0) goto err;\r
+ }\r
+ else {\r
+ alt_num *= (n + 1);\r
+ if (alt_num > THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION) break;\r
+\r
+ if (IS_NULL(root) && IS_NOT_NULL(prev_node)) {\r
+ top_root = root = onig_node_list_add(NULL_NODE, prev_node);\r
+ if (IS_NULL(root)) {\r
+ onig_node_free(prev_node);\r
+ goto mem_err;\r
+ }\r
+ }\r
+\r
+ r = expand_case_fold_string_alt(n, items, p, len, end, reg, &prev_node);\r
+ if (r < 0) goto mem_err;\r
+ if (r == 1) {\r
+ if (IS_NULL(root)) {\r
+ top_root = prev_node;\r
+ }\r
+ else {\r
+ if (IS_NULL(onig_node_list_add(root, prev_node))) {\r
+ onig_node_free(prev_node);\r
+ goto mem_err;\r
+ }\r
+ }\r
+\r
+ root = NCAR(prev_node);\r
+ }\r
+ else { /* r == 0 */\r
+ if (IS_NOT_NULL(root)) {\r
+ if (IS_NULL(onig_node_list_add(root, prev_node))) {\r
+ onig_node_free(prev_node);\r
+ goto mem_err;\r
+ }\r
+ }\r
+ }\r
+\r
+ snode = NULL_NODE;\r
+ }\r
+\r
+ p += len;\r
+ }\r
+\r
+ if (p < end) {\r
+ Node *srem;\r
+\r
+ r = expand_case_fold_make_rem_string(&srem, p, end, reg);\r
+ if (r != 0) goto mem_err;\r
+\r
+ if (IS_NOT_NULL(prev_node) && IS_NULL(root)) {\r
+ top_root = root = onig_node_list_add(NULL_NODE, prev_node);\r
+ if (IS_NULL(root)) {\r
+ onig_node_free(srem);\r
+ onig_node_free(prev_node);\r
+ goto mem_err;\r
+ }\r
+ }\r
+\r
+ if (IS_NULL(root)) {\r
+ prev_node = srem;\r
+ }\r
+ else {\r
+ if (IS_NULL(onig_node_list_add(root, srem))) {\r
+ onig_node_free(srem);\r
+ goto mem_err;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* ending */\r
+ top_root = (IS_NOT_NULL(top_root) ? top_root : prev_node);\r
+ swap_node(node, top_root);\r
+ onig_node_free(top_root);\r
+ return 0;\r
+\r
+ mem_err:\r
+ r = ONIGERR_MEMORY;\r
+\r
+ err:\r
+ onig_node_free(top_root);\r
+ return r;\r
+}\r
+\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+\r
+#define CEC_THRES_NUM_BIG_REPEAT 512\r
+#define CEC_INFINITE_NUM 0x7fffffff\r
+\r
+#define CEC_IN_INFINITE_REPEAT (1<<0)\r
+#define CEC_IN_FINITE_REPEAT (1<<1)\r
+#define CEC_CONT_BIG_REPEAT (1<<2)\r
+\r
+static int\r
+setup_comb_exp_check(Node* node, int state, ScanEnv* env)\r
+{\r
+ int type;\r
+ int r = state;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ {\r
+ Node* prev = NULL_NODE;\r
+ do {\r
+ r = setup_comb_exp_check(NCAR(node), r, env);\r
+ prev = NCAR(node);\r
+ } while (r >= 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ int ret;\r
+ do {\r
+ ret = setup_comb_exp_check(NCAR(node), state, env);\r
+ r |= ret;\r
+ } while (ret >= 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ int child_state = state;\r
+ int add_state = 0;\r
+ QtfrNode* qn = NQTFR(node);\r
+ Node* target = qn->target;\r
+ int var_num;\r
+\r
+ if (! IS_REPEAT_INFINITE(qn->upper)) {\r
+ if (qn->upper > 1) {\r
+ /* {0,1}, {1,1} are allowed */\r
+ child_state |= CEC_IN_FINITE_REPEAT;\r
+\r
+ /* check (a*){n,m}, (a+){n,m} => (a*){n,n}, (a+){n,n} */\r
+ if (env->backrefed_mem == 0) {\r
+ if (NTYPE(qn->target) == NT_ENCLOSE) {\r
+ EncloseNode* en = NENCLOSE(qn->target);\r
+ if (en->type == ENCLOSE_MEMORY) {\r
+ if (NTYPE(en->target) == NT_QTFR) {\r
+ QtfrNode* q = NQTFR(en->target);\r
+ if (IS_REPEAT_INFINITE(q->upper)\r
+ && q->greedy == qn->greedy) {\r
+ qn->upper = (qn->lower == 0 ? 1 : qn->lower);\r
+ if (qn->upper == 1)\r
+ child_state = state;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (state & CEC_IN_FINITE_REPEAT) {\r
+ qn->comb_exp_check_num = -1;\r
+ }\r
+ else {\r
+ if (IS_REPEAT_INFINITE(qn->upper)) {\r
+ var_num = CEC_INFINITE_NUM;\r
+ child_state |= CEC_IN_INFINITE_REPEAT;\r
+ }\r
+ else {\r
+ var_num = qn->upper - qn->lower;\r
+ }\r
+\r
+ if (var_num >= CEC_THRES_NUM_BIG_REPEAT)\r
+ add_state |= CEC_CONT_BIG_REPEAT;\r
+\r
+ if (((state & CEC_IN_INFINITE_REPEAT) != 0 && var_num != 0) ||\r
+ ((state & CEC_CONT_BIG_REPEAT) != 0 &&\r
+ var_num >= CEC_THRES_NUM_BIG_REPEAT)) {\r
+ if (qn->comb_exp_check_num == 0) {\r
+ env->num_comb_exp_check++;\r
+ qn->comb_exp_check_num = env->num_comb_exp_check;\r
+ if (env->curr_max_regnum > env->comb_exp_max_regnum)\r
+ env->comb_exp_max_regnum = env->curr_max_regnum;\r
+ }\r
+ }\r
+ }\r
+\r
+ r = setup_comb_exp_check(target, child_state, env);\r
+ r |= add_state;\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+\r
+ switch (en->type) {\r
+ case ENCLOSE_MEMORY:\r
+ {\r
+ if (env->curr_max_regnum < en->regnum)\r
+ env->curr_max_regnum = en->regnum;\r
+\r
+ r = setup_comb_exp_check(en->target, state, env);\r
+ }\r
+ break;\r
+\r
+ default:\r
+ r = setup_comb_exp_check(en->target, state, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (IS_CALL_RECURSION(NCALL(node)))\r
+ env->has_recursion = 1;\r
+ else\r
+ r = setup_comb_exp_check(NCALL(node)->target, state, env);\r
+ break;\r
+#endif\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+#endif\r
+\r
+#define IN_ALT (1<<0)\r
+#define IN_NOT (1<<1)\r
+#define IN_REPEAT (1<<2)\r
+#define IN_VAR_REPEAT (1<<3)\r
+\r
+/* setup_tree does the following work.\r
+ 1. check empty loop. (set qn->target_empty_info)\r
+ 2. expand ignore-case in char class.\r
+ 3. set memory status bit flags. (reg->mem_stats)\r
+ 4. set qn->head_exact for [push, exact] -> [push_or_jump_exact1, exact].\r
+ 5. find invalid patterns in look-behind.\r
+ 6. expand repeated string.\r
+ */\r
+static int\r
+setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)\r
+{\r
+ int type;\r
+ int r = 0;\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ {\r
+ Node* prev = NULL_NODE;\r
+ do {\r
+ r = setup_tree(NCAR(node), reg, state, env);\r
+ if (IS_NOT_NULL(prev) && r == 0) {\r
+ r = next_setup(prev, NCAR(node), reg);\r
+ }\r
+ prev = NCAR(node);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ }\r
+ break;\r
+\r
+ case NT_ALT:\r
+ do {\r
+ r = setup_tree(NCAR(node), reg, (state | IN_ALT), env);\r
+ } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ break;\r
+\r
+ case NT_STR:\r
+ if (IS_IGNORECASE(reg->options) && !NSTRING_IS_RAW(node)) {\r
+ r = expand_case_fold_string(node, reg);\r
+ }\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ case NT_CANY:\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ break;\r
+#endif\r
+\r
+ case NT_BREF:\r
+ {\r
+ int i;\r
+ int* p;\r
+ Node** nodes = SCANENV_MEM_NODES(env);\r
+ BRefNode* br = NBREF(node);\r
+ p = BACKREFS_P(br);\r
+ for (i = 0; i < br->back_num; i++) {\r
+ if (p[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;\r
+ BIT_STATUS_ON_AT(env->backrefed_mem, p[i]);\r
+ BIT_STATUS_ON_AT(env->bt_mem_start, p[i]);\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ if (IS_BACKREF_NEST_LEVEL(br)) {\r
+ BIT_STATUS_ON_AT(env->bt_mem_end, p[i]);\r
+ }\r
+#endif\r
+ SET_ENCLOSE_STATUS(nodes[p[i]], NST_MEM_BACKREFED);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ {\r
+ OnigDistance d;\r
+ QtfrNode* qn = NQTFR(node);\r
+ Node* target = qn->target;\r
+\r
+ if ((state & IN_REPEAT) != 0) {\r
+ qn->state |= NST_IN_REPEAT;\r
+ }\r
+\r
+ if (IS_REPEAT_INFINITE(qn->upper) || qn->upper >= 1) {\r
+ r = get_min_match_length(target, &d, env);\r
+ if (r) break;\r
+ if (d == 0) {\r
+ qn->target_empty_info = NQ_TARGET_IS_EMPTY;\r
+#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\r
+ r = quantifiers_memory_node_info(target);\r
+ if (r < 0) break;\r
+ if (r > 0) {\r
+ qn->target_empty_info = r;\r
+ }\r
+#endif\r
+#if 0\r
+ r = get_max_match_length(target, &d, env);\r
+ if (r == 0 && d == 0) {\r
+ /* ()* ==> ()?, ()+ ==> () */\r
+ qn->upper = 1;\r
+ if (qn->lower > 1) qn->lower = 1;\r
+ if (NTYPE(target) == NT_STR) {\r
+ qn->upper = qn->lower = 0; /* /(?:)+/ ==> // */\r
+ }\r
+ }\r
+#endif\r
+ }\r
+ }\r
+\r
+ state |= IN_REPEAT;\r
+ if (qn->lower != qn->upper)\r
+ state |= IN_VAR_REPEAT;\r
+ r = setup_tree(target, reg, state, env);\r
+ if (r) break;\r
+\r
+ /* expand string */\r
+#define EXPAND_STRING_MAX_LENGTH 100\r
+ if (NTYPE(target) == NT_STR) {\r
+ if (!IS_REPEAT_INFINITE(qn->lower) && qn->lower == qn->upper &&\r
+ qn->lower > 1 && qn->lower <= EXPAND_STRING_MAX_LENGTH) {\r
+ int len = NSTRING_LEN(target);\r
+ StrNode* sn = NSTR(target);\r
+\r
+ if (len * qn->lower <= EXPAND_STRING_MAX_LENGTH) {\r
+ int i, n = qn->lower;\r
+ onig_node_conv_to_str_node(node, NSTR(target)->flag);\r
+ for (i = 0; i < n; i++) {\r
+ r = onig_node_str_cat(node, sn->s, sn->end);\r
+ if (r) break;\r
+ }\r
+ onig_node_free(target);\r
+ break; /* break case NT_QTFR: */\r
+ }\r
+ }\r
+ }\r
+\r
+#ifdef USE_OP_PUSH_OR_JUMP_EXACT\r
+ if (qn->greedy && (qn->target_empty_info != 0)) {\r
+ if (NTYPE(target) == NT_QTFR) {\r
+ QtfrNode* tqn = NQTFR(target);\r
+ if (IS_NOT_NULL(tqn->head_exact)) {\r
+ qn->head_exact = tqn->head_exact;\r
+ tqn->head_exact = NULL;\r
+ }\r
+ }\r
+ else {\r
+ qn->head_exact = get_head_value_node(qn->target, 1, reg);\r
+ }\r
+ }\r
+#endif\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+\r
+ switch (en->type) {\r
+ case ENCLOSE_OPTION:\r
+ {\r
+ OnigOptionType options = reg->options;\r
+ reg->options = NENCLOSE(node)->option;\r
+ r = setup_tree(NENCLOSE(node)->target, reg, state, env);\r
+ reg->options = options;\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_MEMORY:\r
+ if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT)) != 0) {\r
+ BIT_STATUS_ON_AT(env->bt_mem_start, en->regnum);\r
+ /* SET_ENCLOSE_STATUS(node, NST_MEM_IN_ALT_NOT); */\r
+ }\r
+ r = setup_tree(en->target, reg, state, env);\r
+ break;\r
+\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ {\r
+ Node* target = en->target;\r
+ r = setup_tree(target, reg, state, env);\r
+ if (NTYPE(target) == NT_QTFR) {\r
+ QtfrNode* tqn = NQTFR(target);\r
+ if (IS_REPEAT_INFINITE(tqn->upper) && tqn->lower <= 1 &&\r
+ tqn->greedy != 0) { /* (?>a*), a*+ etc... */\r
+ int qtype = NTYPE(tqn->target);\r
+ if (IS_NODE_TYPE_SIMPLE(qtype))\r
+ SET_ENCLOSE_STATUS(node, NST_STOP_BT_SIMPLE_REPEAT);\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ {\r
+ AnchorNode* an = NANCHOR(node);\r
+\r
+ switch (an->type) {\r
+ case ANCHOR_PREC_READ:\r
+ r = setup_tree(an->target, reg, state, env);\r
+ break;\r
+ case ANCHOR_PREC_READ_NOT:\r
+ r = setup_tree(an->target, reg, (state | IN_NOT), env);\r
+ break;\r
+\r
+/* allowed node types in look-behind */\r
+#define ALLOWED_TYPE_IN_LB \\r
+ ( BIT_NT_LIST | BIT_NT_ALT | BIT_NT_STR | BIT_NT_CCLASS | BIT_NT_CTYPE | \\r
+ BIT_NT_CANY | BIT_NT_ANCHOR | BIT_NT_ENCLOSE | BIT_NT_QTFR | BIT_NT_CALL )\r
+\r
+#define ALLOWED_ENCLOSE_IN_LB ( ENCLOSE_MEMORY )\r
+#define ALLOWED_ENCLOSE_IN_LB_NOT 0\r
+\r
+#define ALLOWED_ANCHOR_IN_LB \\r
+( ANCHOR_LOOK_BEHIND | ANCHOR_BEGIN_LINE | ANCHOR_END_LINE | ANCHOR_BEGIN_BUF | ANCHOR_BEGIN_POSITION )\r
+#define ALLOWED_ANCHOR_IN_LB_NOT \\r
+( ANCHOR_LOOK_BEHIND | ANCHOR_LOOK_BEHIND_NOT | ANCHOR_BEGIN_LINE | ANCHOR_END_LINE | ANCHOR_BEGIN_BUF | ANCHOR_BEGIN_POSITION )\r
+\r
+ case ANCHOR_LOOK_BEHIND:\r
+ {\r
+ r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,\r
+ ALLOWED_ENCLOSE_IN_LB, ALLOWED_ANCHOR_IN_LB);\r
+ if (r < 0) return r;\r
+ if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ r = setup_look_behind(node, reg, env);\r
+ if (r != 0) return r;\r
+ r = setup_tree(an->target, reg, state, env);\r
+ }\r
+ break;\r
+\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ {\r
+ r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,\r
+ ALLOWED_ENCLOSE_IN_LB_NOT, ALLOWED_ANCHOR_IN_LB_NOT);\r
+ if (r < 0) return r;\r
+ if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\r
+ r = setup_look_behind(node, reg, env);\r
+ if (r != 0) return r;\r
+ r = setup_tree(an->target, reg, (state | IN_NOT), env);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+/* set skip map for Boyer-Moor search */\r
+static int\r
+set_bm_skip(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED,\r
+ UChar skip[], int** int_skip)\r
+{\r
+ int i, len;\r
+\r
+ len = (int)(end - s);\r
+ if (len < ONIG_CHAR_TABLE_SIZE) {\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) skip[i] = (UChar)len;\r
+\r
+ for (i = 0; i < len - 1; i++)\r
+ skip[s[i]] = (UChar)(len - 1 - i);\r
+ }\r
+ else {\r
+ if (IS_NULL(*int_skip)) {\r
+ *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);\r
+ if (IS_NULL(*int_skip)) return ONIGERR_MEMORY;\r
+ }\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = len;\r
+\r
+ for (i = 0; i < len - 1; i++)\r
+ (*int_skip)[s[i]] = len - 1 - i;\r
+ }\r
+ return 0;\r
+}\r
+\r
+#define OPT_EXACT_MAXLEN 24\r
+\r
+typedef struct {\r
+ OnigDistance min; /* min byte length */\r
+ OnigDistance max; /* max byte length */\r
+} MinMaxLen;\r
+\r
+typedef struct {\r
+ MinMaxLen mmd;\r
+ OnigEncoding enc;\r
+ OnigOptionType options;\r
+ OnigCaseFoldType case_fold_flag;\r
+ ScanEnv* scan_env;\r
+} OptEnv;\r
+\r
+typedef struct {\r
+ int left_anchor;\r
+ int right_anchor;\r
+} OptAncInfo;\r
+\r
+typedef struct {\r
+ MinMaxLen mmd; /* info position */\r
+ OptAncInfo anc;\r
+\r
+ int reach_end;\r
+ int ignore_case;\r
+ int len;\r
+ UChar s[OPT_EXACT_MAXLEN];\r
+} OptExactInfo;\r
+\r
+typedef struct {\r
+ MinMaxLen mmd; /* info position */\r
+ OptAncInfo anc;\r
+\r
+ int value; /* weighted value */\r
+ UChar map[ONIG_CHAR_TABLE_SIZE];\r
+} OptMapInfo;\r
+\r
+typedef struct {\r
+ MinMaxLen len;\r
+\r
+ OptAncInfo anc;\r
+ OptExactInfo exb; /* boundary */\r
+ OptExactInfo exm; /* middle */\r
+ OptExactInfo expr; /* prec read (?=...) */\r
+\r
+ OptMapInfo map; /* boundary */\r
+} NodeOptInfo;\r
+\r
+\r
+static int\r
+map_position_value(OnigEncoding enc, int i)\r
+{\r
+ static const short int ByteValTable[] = {\r
+ 5, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 10, 1, 1,\r
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r
+ 12, 4, 7, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,\r
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5,\r
+ 5, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 5, 5,\r
+ 5, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 1\r
+ };\r
+\r
+ if (i < (int )(sizeof(ByteValTable)/sizeof(ByteValTable[0]))) {\r
+ if (i == 0 && ONIGENC_MBC_MINLEN(enc) > 1)\r
+ return 20;\r
+ else\r
+ return (int )ByteValTable[i];\r
+ }\r
+ else\r
+ return 4; /* Take it easy. */\r
+}\r
+\r
+static int\r
+distance_value(MinMaxLen* mm)\r
+{\r
+ /* 1000 / (min-max-dist + 1) */\r
+ static const short int dist_vals[] = {\r
+ 1000, 500, 333, 250, 200, 167, 143, 125, 111, 100, \r
+ 91, 83, 77, 71, 67, 63, 59, 56, 53, 50, \r
+ 48, 45, 43, 42, 40, 38, 37, 36, 34, 33, \r
+ 32, 31, 30, 29, 29, 28, 27, 26, 26, 25, \r
+ 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, \r
+ 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, \r
+ 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, \r
+ 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, \r
+ 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, \r
+ 11, 11, 11, 11, 11, 10, 10, 10, 10, 10\r
+ };\r
+\r
+ int d;\r
+\r
+ if (mm->max == ONIG_INFINITE_DISTANCE) return 0;\r
+\r
+ d = mm->max - mm->min;\r
+ if (d < (int )(sizeof(dist_vals)/sizeof(dist_vals[0])))\r
+ /* return dist_vals[d] * 16 / (mm->min + 12); */\r
+ return (int )dist_vals[d];\r
+ else\r
+ return 1;\r
+}\r
+\r
+static int\r
+comp_distance_value(MinMaxLen* d1, MinMaxLen* d2, int v1, int v2)\r
+{\r
+ if (v2 <= 0) return -1;\r
+ if (v1 <= 0) return 1;\r
+\r
+ v1 *= distance_value(d1);\r
+ v2 *= distance_value(d2);\r
+\r
+ if (v2 > v1) return 1;\r
+ if (v2 < v1) return -1;\r
+\r
+ if (d2->min < d1->min) return 1;\r
+ if (d2->min > d1->min) return -1;\r
+ return 0;\r
+}\r
+\r
+static int\r
+is_equal_mml(MinMaxLen* a, MinMaxLen* b)\r
+{\r
+ return (a->min == b->min && a->max == b->max) ? 1 : 0;\r
+}\r
+\r
+\r
+static void\r
+set_mml(MinMaxLen* mml, OnigDistance min, OnigDistance max)\r
+{\r
+ mml->min = min;\r
+ mml->max = max;\r
+}\r
+\r
+static void\r
+clear_mml(MinMaxLen* mml)\r
+{\r
+ mml->min = mml->max = 0;\r
+}\r
+\r
+static void\r
+copy_mml(MinMaxLen* to, MinMaxLen* from)\r
+{\r
+ to->min = from->min;\r
+ to->max = from->max;\r
+}\r
+\r
+static void\r
+add_mml(MinMaxLen* to, MinMaxLen* from)\r
+{\r
+ to->min = distance_add(to->min, from->min);\r
+ to->max = distance_add(to->max, from->max);\r
+}\r
+\r
+#if 0\r
+static void\r
+add_len_mml(MinMaxLen* to, OnigDistance len)\r
+{\r
+ to->min = distance_add(to->min, len);\r
+ to->max = distance_add(to->max, len);\r
+}\r
+#endif\r
+\r
+static void\r
+alt_merge_mml(MinMaxLen* to, MinMaxLen* from)\r
+{\r
+ if (to->min > from->min) to->min = from->min;\r
+ if (to->max < from->max) to->max = from->max;\r
+}\r
+\r
+static void\r
+copy_opt_env(OptEnv* to, OptEnv* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+static void\r
+clear_opt_anc_info(OptAncInfo* anc)\r
+{\r
+ anc->left_anchor = 0;\r
+ anc->right_anchor = 0;\r
+}\r
+\r
+static void\r
+copy_opt_anc_info(OptAncInfo* to, OptAncInfo* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+static void\r
+concat_opt_anc_info(OptAncInfo* to, OptAncInfo* left, OptAncInfo* right,\r
+ OnigDistance left_len, OnigDistance right_len)\r
+{\r
+ clear_opt_anc_info(to);\r
+\r
+ to->left_anchor = left->left_anchor;\r
+ if (left_len == 0) {\r
+ to->left_anchor |= right->left_anchor;\r
+ }\r
+\r
+ to->right_anchor = right->right_anchor;\r
+ if (right_len == 0) {\r
+ to->right_anchor |= left->right_anchor;\r
+ }\r
+}\r
+\r
+static int\r
+is_left_anchor(int anc)\r
+{\r
+ if (anc == ANCHOR_END_BUF || anc == ANCHOR_SEMI_END_BUF ||\r
+ anc == ANCHOR_END_LINE || anc == ANCHOR_PREC_READ ||\r
+ anc == ANCHOR_PREC_READ_NOT)\r
+ return 0;\r
+\r
+ return 1;\r
+}\r
+\r
+static int\r
+is_set_opt_anc_info(OptAncInfo* to, int anc)\r
+{\r
+ if ((to->left_anchor & anc) != 0) return 1;\r
+\r
+ return ((to->right_anchor & anc) != 0 ? 1 : 0);\r
+}\r
+\r
+static void\r
+add_opt_anc_info(OptAncInfo* to, int anc)\r
+{\r
+ if (is_left_anchor(anc))\r
+ to->left_anchor |= anc;\r
+ else\r
+ to->right_anchor |= anc;\r
+}\r
+\r
+static void\r
+remove_opt_anc_info(OptAncInfo* to, int anc)\r
+{\r
+ if (is_left_anchor(anc))\r
+ to->left_anchor &= ~anc;\r
+ else\r
+ to->right_anchor &= ~anc;\r
+}\r
+\r
+static void\r
+alt_merge_opt_anc_info(OptAncInfo* to, OptAncInfo* add)\r
+{\r
+ to->left_anchor &= add->left_anchor;\r
+ to->right_anchor &= add->right_anchor;\r
+}\r
+\r
+static int\r
+is_full_opt_exact_info(OptExactInfo* ex)\r
+{\r
+ return (ex->len >= OPT_EXACT_MAXLEN ? 1 : 0);\r
+}\r
+\r
+static void\r
+clear_opt_exact_info(OptExactInfo* ex)\r
+{\r
+ clear_mml(&ex->mmd);\r
+ clear_opt_anc_info(&ex->anc);\r
+ ex->reach_end = 0;\r
+ ex->ignore_case = 0;\r
+ ex->len = 0;\r
+ ex->s[0] = '\0';\r
+}\r
+\r
+static void\r
+copy_opt_exact_info(OptExactInfo* to, OptExactInfo* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+static void\r
+concat_opt_exact_info(OptExactInfo* to, OptExactInfo* add, OnigEncoding enc)\r
+{\r
+ int i, j, len;\r
+ UChar *p, *end;\r
+ OptAncInfo tanc;\r
+\r
+ if (! to->ignore_case && add->ignore_case) {\r
+ if (to->len >= add->len) return ; /* avoid */\r
+\r
+ to->ignore_case = 1;\r
+ }\r
+\r
+ p = add->s;\r
+ end = p + add->len;\r
+ for (i = to->len; p < end; ) {\r
+ len = enclen(enc, p);\r
+ if (i + len > OPT_EXACT_MAXLEN) break;\r
+ for (j = 0; j < len && p < end; j++)\r
+ to->s[i++] = *p++;\r
+ }\r
+\r
+ to->len = i;\r
+ to->reach_end = (p == end ? add->reach_end : 0);\r
+\r
+ concat_opt_anc_info(&tanc, &to->anc, &add->anc, 1, 1);\r
+ if (! to->reach_end) tanc.right_anchor = 0;\r
+ copy_opt_anc_info(&to->anc, &tanc);\r
+}\r
+\r
+static void\r
+concat_opt_exact_info_str(OptExactInfo* to, UChar* s, UChar* end,\r
+ int raw ARG_UNUSED, OnigEncoding enc)\r
+{\r
+ int i, j, len;\r
+ UChar *p;\r
+\r
+ for (i = to->len, p = s; p < end && i < OPT_EXACT_MAXLEN; ) {\r
+ len = enclen(enc, p);\r
+ if (i + len > OPT_EXACT_MAXLEN) break;\r
+ for (j = 0; j < len && p < end; j++)\r
+ to->s[i++] = *p++;\r
+ }\r
+\r
+ to->len = i;\r
+}\r
+\r
+static void\r
+alt_merge_opt_exact_info(OptExactInfo* to, OptExactInfo* add, OptEnv* env)\r
+{\r
+ int i, j, len;\r
+\r
+ if (add->len == 0 || to->len == 0) {\r
+ clear_opt_exact_info(to);\r
+ return ;\r
+ }\r
+\r
+ if (! is_equal_mml(&to->mmd, &add->mmd)) {\r
+ clear_opt_exact_info(to);\r
+ return ;\r
+ }\r
+\r
+ for (i = 0; i < to->len && i < add->len; ) {\r
+ if (to->s[i] != add->s[i]) break;\r
+ len = enclen(env->enc, to->s + i);\r
+\r
+ for (j = 1; j < len; j++) {\r
+ if (to->s[i+j] != add->s[i+j]) break;\r
+ }\r
+ if (j < len) break;\r
+ i += len;\r
+ }\r
+\r
+ if (! add->reach_end || i < add->len || i < to->len) {\r
+ to->reach_end = 0;\r
+ }\r
+ to->len = i;\r
+ to->ignore_case |= add->ignore_case;\r
+\r
+ alt_merge_opt_anc_info(&to->anc, &add->anc);\r
+ if (! to->reach_end) to->anc.right_anchor = 0;\r
+}\r
+\r
+static void\r
+select_opt_exact_info(OnigEncoding enc, OptExactInfo* now, OptExactInfo* alt)\r
+{\r
+ int v1, v2;\r
+\r
+ v1 = now->len;\r
+ v2 = alt->len;\r
+\r
+ if (v2 == 0) {\r
+ return ;\r
+ }\r
+ else if (v1 == 0) {\r
+ copy_opt_exact_info(now, alt);\r
+ return ;\r
+ }\r
+ else if (v1 <= 2 && v2 <= 2) {\r
+ /* ByteValTable[x] is big value --> low price */\r
+ v2 = map_position_value(enc, now->s[0]);\r
+ v1 = map_position_value(enc, alt->s[0]);\r
+\r
+ if (now->len > 1) v1 += 5;\r
+ if (alt->len > 1) v2 += 5;\r
+ }\r
+\r
+ if (now->ignore_case == 0) v1 *= 2;\r
+ if (alt->ignore_case == 0) v2 *= 2;\r
+\r
+ if (comp_distance_value(&now->mmd, &alt->mmd, v1, v2) > 0)\r
+ copy_opt_exact_info(now, alt);\r
+}\r
+\r
+static void\r
+clear_opt_map_info(OptMapInfo* map)\r
+{\r
+ static const OptMapInfo clean_info = {\r
+ {0, 0}, {0, 0}, 0,\r
+ {\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r
+ }\r
+ };\r
+\r
+ xmemcpy(map, &clean_info, sizeof(OptMapInfo));\r
+}\r
+\r
+static void\r
+copy_opt_map_info(OptMapInfo* to, OptMapInfo* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+static void\r
+add_char_opt_map_info(OptMapInfo* map, UChar c, OnigEncoding enc)\r
+{\r
+ if (map->map[c] == 0) {\r
+ map->map[c] = 1;\r
+ map->value += map_position_value(enc, c);\r
+ }\r
+}\r
+\r
+static int\r
+add_char_amb_opt_map_info(OptMapInfo* map, UChar* p, UChar* end,\r
+ OnigEncoding enc, OnigCaseFoldType case_fold_flag)\r
+{\r
+ OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\r
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\r
+ int i, n;\r
+\r
+ add_char_opt_map_info(map, p[0], enc);\r
+\r
+ case_fold_flag = DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag);\r
+ n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, case_fold_flag, p, end, items);\r
+ if (n < 0) return n;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ ONIGENC_CODE_TO_MBC(enc, items[i].code[0], buf);\r
+ add_char_opt_map_info(map, buf[0], enc);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static void\r
+select_opt_map_info(OptMapInfo* now, OptMapInfo* alt)\r
+{\r
+ static int z = 1<<15; /* 32768: something big value */\r
+\r
+ int v1, v2;\r
+\r
+ if (alt->value == 0) return ;\r
+ if (now->value == 0) {\r
+ copy_opt_map_info(now, alt);\r
+ return ;\r
+ }\r
+\r
+ v1 = z / now->value;\r
+ v2 = z / alt->value;\r
+ if (comp_distance_value(&now->mmd, &alt->mmd, v1, v2) > 0)\r
+ copy_opt_map_info(now, alt);\r
+}\r
+\r
+static int\r
+comp_opt_exact_or_map_info(OptExactInfo* e, OptMapInfo* m)\r
+{\r
+#define COMP_EM_BASE 20\r
+ int ve, vm;\r
+\r
+ if (m->value <= 0) return -1;\r
+\r
+ ve = COMP_EM_BASE * e->len * (e->ignore_case ? 1 : 2);\r
+ vm = COMP_EM_BASE * 5 * 2 / m->value;\r
+ return comp_distance_value(&e->mmd, &m->mmd, ve, vm);\r
+}\r
+\r
+static void\r
+alt_merge_opt_map_info(OnigEncoding enc, OptMapInfo* to, OptMapInfo* add)\r
+{\r
+ int i, val;\r
+\r
+ /* if (! is_equal_mml(&to->mmd, &add->mmd)) return ; */\r
+ if (to->value == 0) return ;\r
+ if (add->value == 0 || to->mmd.max < add->mmd.min) {\r
+ clear_opt_map_info(to);\r
+ return ;\r
+ }\r
+\r
+ alt_merge_mml(&to->mmd, &add->mmd);\r
+\r
+ val = 0;\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {\r
+ if (add->map[i])\r
+ to->map[i] = 1;\r
+\r
+ if (to->map[i])\r
+ val += map_position_value(enc, i);\r
+ }\r
+ to->value = val;\r
+\r
+ alt_merge_opt_anc_info(&to->anc, &add->anc);\r
+}\r
+\r
+static void\r
+set_bound_node_opt_info(NodeOptInfo* opt, MinMaxLen* mmd)\r
+{\r
+ copy_mml(&(opt->exb.mmd), mmd);\r
+ copy_mml(&(opt->expr.mmd), mmd);\r
+ copy_mml(&(opt->map.mmd), mmd);\r
+}\r
+\r
+static void\r
+clear_node_opt_info(NodeOptInfo* opt)\r
+{\r
+ clear_mml(&opt->len);\r
+ clear_opt_anc_info(&opt->anc);\r
+ clear_opt_exact_info(&opt->exb);\r
+ clear_opt_exact_info(&opt->exm);\r
+ clear_opt_exact_info(&opt->expr);\r
+ clear_opt_map_info(&opt->map);\r
+}\r
+\r
+static void\r
+copy_node_opt_info(NodeOptInfo* to, NodeOptInfo* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+static void\r
+concat_left_node_opt_info(OnigEncoding enc, NodeOptInfo* to, NodeOptInfo* add)\r
+{\r
+ int exb_reach, exm_reach;\r
+ OptAncInfo tanc;\r
+\r
+ concat_opt_anc_info(&tanc, &to->anc, &add->anc, to->len.max, add->len.max);\r
+ copy_opt_anc_info(&to->anc, &tanc);\r
+\r
+ if (add->exb.len > 0 && to->len.max == 0) {\r
+ concat_opt_anc_info(&tanc, &to->anc, &add->exb.anc,\r
+ to->len.max, add->len.max);\r
+ copy_opt_anc_info(&add->exb.anc, &tanc);\r
+ }\r
+\r
+ if (add->map.value > 0 && to->len.max == 0) {\r
+ if (add->map.mmd.max == 0)\r
+ add->map.anc.left_anchor |= to->anc.left_anchor;\r
+ }\r
+\r
+ exb_reach = to->exb.reach_end;\r
+ exm_reach = to->exm.reach_end;\r
+\r
+ if (add->len.max != 0)\r
+ to->exb.reach_end = to->exm.reach_end = 0;\r
+\r
+ if (add->exb.len > 0) {\r
+ if (exb_reach) {\r
+ concat_opt_exact_info(&to->exb, &add->exb, enc);\r
+ clear_opt_exact_info(&add->exb);\r
+ }\r
+ else if (exm_reach) {\r
+ concat_opt_exact_info(&to->exm, &add->exb, enc);\r
+ clear_opt_exact_info(&add->exb);\r
+ }\r
+ }\r
+ select_opt_exact_info(enc, &to->exm, &add->exb);\r
+ select_opt_exact_info(enc, &to->exm, &add->exm);\r
+\r
+ if (to->expr.len > 0) {\r
+ if (add->len.max > 0) {\r
+ if (to->expr.len > (int )add->len.max)\r
+ to->expr.len = add->len.max;\r
+\r
+ if (to->expr.mmd.max == 0)\r
+ select_opt_exact_info(enc, &to->exb, &to->expr);\r
+ else\r
+ select_opt_exact_info(enc, &to->exm, &to->expr);\r
+ }\r
+ }\r
+ else if (add->expr.len > 0) {\r
+ copy_opt_exact_info(&to->expr, &add->expr);\r
+ }\r
+\r
+ select_opt_map_info(&to->map, &add->map);\r
+\r
+ add_mml(&to->len, &add->len);\r
+}\r
+\r
+static void\r
+alt_merge_node_opt_info(NodeOptInfo* to, NodeOptInfo* add, OptEnv* env)\r
+{\r
+ alt_merge_opt_anc_info (&to->anc, &add->anc);\r
+ alt_merge_opt_exact_info(&to->exb, &add->exb, env);\r
+ alt_merge_opt_exact_info(&to->exm, &add->exm, env);\r
+ alt_merge_opt_exact_info(&to->expr, &add->expr, env);\r
+ alt_merge_opt_map_info(env->enc, &to->map, &add->map);\r
+\r
+ alt_merge_mml(&to->len, &add->len);\r
+}\r
+\r
+\r
+#define MAX_NODE_OPT_INFO_REF_COUNT 5\r
+\r
+static int\r
+optimize_node_left(Node* node, NodeOptInfo* opt, OptEnv* env)\r
+{\r
+ int type;\r
+ int r = 0;\r
+\r
+ clear_node_opt_info(opt);\r
+ set_bound_node_opt_info(opt, &env->mmd);\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ {\r
+ OptEnv nenv;\r
+ NodeOptInfo nopt;\r
+ Node* nd = node;\r
+\r
+ copy_opt_env(&nenv, env);\r
+ do {\r
+ r = optimize_node_left(NCAR(nd), &nopt, &nenv);\r
+ if (r == 0) {\r
+ add_mml(&nenv.mmd, &nopt.len);\r
+ concat_left_node_opt_info(env->enc, opt, &nopt);\r
+ }\r
+ } while (r == 0 && IS_NOT_NULL(nd = NCDR(nd)));\r
+ }\r
+ break;\r
+\r
+ case NT_ALT:\r
+ {\r
+ NodeOptInfo nopt;\r
+ Node* nd = node;\r
+\r
+ do {\r
+ r = optimize_node_left(NCAR(nd), &nopt, env);\r
+ if (r == 0) {\r
+ if (nd == node) copy_node_opt_info(opt, &nopt);\r
+ else alt_merge_node_opt_info(opt, &nopt, env);\r
+ }\r
+ } while ((r == 0) && IS_NOT_NULL(nd = NCDR(nd)));\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ {\r
+ StrNode* sn = NSTR(node);\r
+ int slen = (int)(sn->end - sn->s);\r
+ int is_raw = NSTRING_IS_RAW(node);\r
+\r
+ if (! NSTRING_IS_AMBIG(node)) {\r
+ concat_opt_exact_info_str(&opt->exb, sn->s, sn->end,\r
+ NSTRING_IS_RAW(node), env->enc);\r
+ if (slen > 0) {\r
+ add_char_opt_map_info(&opt->map, *(sn->s), env->enc);\r
+ }\r
+ set_mml(&opt->len, slen, slen);\r
+ }\r
+ else {\r
+ int max;\r
+\r
+ if (NSTRING_IS_DONT_GET_OPT_INFO(node)) {\r
+ int n = onigenc_strlen(env->enc, sn->s, sn->end);\r
+ max = ONIGENC_MBC_MAXLEN_DIST(env->enc) * n;\r
+ }\r
+ else {\r
+ concat_opt_exact_info_str(&opt->exb, sn->s, sn->end,\r
+ is_raw, env->enc);\r
+ opt->exb.ignore_case = 1;\r
+\r
+ if (slen > 0) {\r
+ r = add_char_amb_opt_map_info(&opt->map, sn->s, sn->end,\r
+ env->enc, env->case_fold_flag);\r
+ if (r != 0) break;\r
+ }\r
+\r
+ max = slen;\r
+ }\r
+\r
+ set_mml(&opt->len, slen, max);\r
+ }\r
+\r
+ if (opt->exb.len == slen)\r
+ opt->exb.reach_end = 1;\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ {\r
+ int i, z;\r
+ CClassNode* cc = NCCLASS(node);\r
+\r
+ /* no need to check ignore case. (setted in setup_tree()) */\r
+\r
+ if (IS_NOT_NULL(cc->mbuf) || IS_NCCLASS_NOT(cc)) {\r
+ OnigDistance min = ONIGENC_MBC_MINLEN(env->enc);\r
+ OnigDistance max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\r
+\r
+ set_mml(&opt->len, min, max);\r
+ }\r
+ else {\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ z = BITSET_AT(cc->bs, i);\r
+ if ((z && !IS_NCCLASS_NOT(cc)) || (!z && IS_NCCLASS_NOT(cc))) {\r
+ add_char_opt_map_info(&opt->map, (UChar )i, env->enc);\r
+ }\r
+ }\r
+ set_mml(&opt->len, 1, 1);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ {\r
+ int i, min, max;\r
+\r
+ max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\r
+\r
+ if (max == 1) {\r
+ min = 1;\r
+\r
+ switch (NCTYPE(node)->ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (NCTYPE(node)->not != 0) {\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (! ONIGENC_IS_CODE_WORD(env->enc, i)) {\r
+ add_char_opt_map_info(&opt->map, (UChar )i, env->enc);\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\r
+ if (ONIGENC_IS_CODE_WORD(env->enc, i)) {\r
+ add_char_opt_map_info(&opt->map, (UChar )i, env->enc);\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ min = ONIGENC_MBC_MINLEN(env->enc);\r
+ }\r
+ set_mml(&opt->len, min, max);\r
+ }\r
+ break;\r
+\r
+ case NT_CANY:\r
+ {\r
+ OnigDistance min = ONIGENC_MBC_MINLEN(env->enc);\r
+ OnigDistance max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\r
+ set_mml(&opt->len, min, max);\r
+ }\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ switch (NANCHOR(node)->type) {\r
+ case ANCHOR_BEGIN_BUF:\r
+ case ANCHOR_BEGIN_POSITION:\r
+ case ANCHOR_BEGIN_LINE:\r
+ case ANCHOR_END_BUF:\r
+ case ANCHOR_SEMI_END_BUF:\r
+ case ANCHOR_END_LINE:\r
+ add_opt_anc_info(&opt->anc, NANCHOR(node)->type);\r
+ break;\r
+\r
+ case ANCHOR_PREC_READ:\r
+ {\r
+ NodeOptInfo nopt;\r
+\r
+ r = optimize_node_left(NANCHOR(node)->target, &nopt, env);\r
+ if (r == 0) {\r
+ if (nopt.exb.len > 0)\r
+ copy_opt_exact_info(&opt->expr, &nopt.exb);\r
+ else if (nopt.exm.len > 0)\r
+ copy_opt_exact_info(&opt->expr, &nopt.exm);\r
+\r
+ opt->expr.reach_end = 0;\r
+\r
+ if (nopt.map.value > 0)\r
+ copy_opt_map_info(&opt->map, &nopt.map);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case ANCHOR_PREC_READ_NOT:\r
+ case ANCHOR_LOOK_BEHIND: /* Sorry, I can't make use of it. */\r
+ case ANCHOR_LOOK_BEHIND_NOT:\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case NT_BREF:\r
+ {\r
+ int i;\r
+ int* backs;\r
+ OnigDistance min, max, tmin, tmax;\r
+ Node** nodes = SCANENV_MEM_NODES(env->scan_env);\r
+ BRefNode* br = NBREF(node);\r
+\r
+ if (br->state & NST_RECURSION) {\r
+ set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);\r
+ break;\r
+ }\r
+ backs = BACKREFS_P(br);\r
+ r = get_min_match_length(nodes[backs[0]], &min, env->scan_env);\r
+ if (r != 0) break;\r
+ r = get_max_match_length(nodes[backs[0]], &max, env->scan_env);\r
+ if (r != 0) break;\r
+ for (i = 1; i < br->back_num; i++) {\r
+ r = get_min_match_length(nodes[backs[i]], &tmin, env->scan_env);\r
+ if (r != 0) break;\r
+ r = get_max_match_length(nodes[backs[i]], &tmax, env->scan_env);\r
+ if (r != 0) break;\r
+ if (min > tmin) min = tmin;\r
+ if (max < tmax) max = tmax;\r
+ }\r
+ if (r == 0) set_mml(&opt->len, min, max);\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ if (IS_CALL_RECURSION(NCALL(node)))\r
+ set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);\r
+ else {\r
+ OnigOptionType save = env->options;\r
+ env->options = NENCLOSE(NCALL(node)->target)->option;\r
+ r = optimize_node_left(NCALL(node)->target, opt, env);\r
+ env->options = save;\r
+ }\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ {\r
+ int i;\r
+ OnigDistance min, max;\r
+ NodeOptInfo nopt;\r
+ QtfrNode* qn = NQTFR(node);\r
+\r
+ r = optimize_node_left(qn->target, &nopt, env);\r
+ if (r) break;\r
+\r
+ if (qn->lower == 0 && IS_REPEAT_INFINITE(qn->upper)) {\r
+ if (env->mmd.max == 0 &&\r
+ NTYPE(qn->target) == NT_CANY && qn->greedy) {\r
+ if (IS_MULTILINE(env->options))\r
+ add_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_ML);\r
+ else\r
+ add_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR);\r
+ }\r
+ }\r
+ else {\r
+ if (qn->lower > 0) {\r
+ copy_node_opt_info(opt, &nopt);\r
+ if (nopt.exb.len > 0) {\r
+ if (nopt.exb.reach_end) {\r
+ for (i = 2; i <= qn->lower &&\r
+ ! is_full_opt_exact_info(&opt->exb); i++) {\r
+ concat_opt_exact_info(&opt->exb, &nopt.exb, env->enc);\r
+ }\r
+ if (i < qn->lower) {\r
+ opt->exb.reach_end = 0;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (qn->lower != qn->upper) {\r
+ opt->exb.reach_end = 0;\r
+ opt->exm.reach_end = 0;\r
+ }\r
+ if (qn->lower > 1)\r
+ opt->exm.reach_end = 0;\r
+ }\r
+ }\r
+\r
+ min = distance_multiply(nopt.len.min, qn->lower);\r
+ if (IS_REPEAT_INFINITE(qn->upper))\r
+ max = (nopt.len.max > 0 ? ONIG_INFINITE_DISTANCE : 0);\r
+ else\r
+ max = distance_multiply(nopt.len.max, qn->upper);\r
+\r
+ set_mml(&opt->len, min, max);\r
+ }\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ {\r
+ EncloseNode* en = NENCLOSE(node);\r
+\r
+ switch (en->type) {\r
+ case ENCLOSE_OPTION:\r
+ {\r
+ OnigOptionType save = env->options;\r
+\r
+ env->options = en->option;\r
+ r = optimize_node_left(en->target, opt, env);\r
+ env->options = save;\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_MEMORY:\r
+#ifdef USE_SUBEXP_CALL\r
+ en->opt_count++;\r
+ if (en->opt_count > MAX_NODE_OPT_INFO_REF_COUNT) {\r
+ OnigDistance min, max;\r
+\r
+ min = 0;\r
+ max = ONIG_INFINITE_DISTANCE;\r
+ if (IS_ENCLOSE_MIN_FIXED(en)) min = en->min_len;\r
+ if (IS_ENCLOSE_MAX_FIXED(en)) max = en->max_len;\r
+ set_mml(&opt->len, min, max);\r
+ }\r
+ else\r
+#endif\r
+ {\r
+ r = optimize_node_left(en->target, opt, env);\r
+\r
+ if (is_set_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_MASK)) {\r
+ if (BIT_STATUS_AT(env->scan_env->backrefed_mem, en->regnum))\r
+ remove_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_MASK);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ r = optimize_node_left(en->target, opt, env);\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+#ifdef ONIG_DEBUG\r
+ fprintf(stderr, "optimize_node_left: undefined node type %d\n",\r
+ NTYPE(node));\r
+#endif\r
+ r = ONIGERR_TYPE_BUG;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+set_optimize_exact_info(regex_t* reg, OptExactInfo* e)\r
+{\r
+ int r;\r
+\r
+ if (e->len == 0) return 0;\r
+\r
+ if (e->ignore_case) {\r
+ reg->exact = (UChar* )xmalloc(e->len);\r
+ CHECK_NULL_RETURN_MEMERR(reg->exact);\r
+ xmemcpy(reg->exact, e->s, e->len);\r
+ reg->exact_end = reg->exact + e->len;\r
+ reg->optimize = ONIG_OPTIMIZE_EXACT_IC;\r
+ }\r
+ else {\r
+ int allow_reverse;\r
+\r
+ reg->exact = str_dup(e->s, e->s + e->len);\r
+ CHECK_NULL_RETURN_MEMERR(reg->exact);\r
+ reg->exact_end = reg->exact + e->len;\r
+ \r
+ allow_reverse =\r
+ ONIGENC_IS_ALLOWED_REVERSE_MATCH(reg->enc, reg->exact, reg->exact_end);\r
+\r
+ if (e->len >= 3 || (e->len >= 2 && allow_reverse)) {\r
+ r = set_bm_skip(reg->exact, reg->exact_end, reg->enc,\r
+ reg->map, &(reg->int_map));\r
+ if (r) return r;\r
+\r
+ reg->optimize = (allow_reverse != 0\r
+ ? ONIG_OPTIMIZE_EXACT_BM : ONIG_OPTIMIZE_EXACT_BM_NOT_REV);\r
+ }\r
+ else {\r
+ reg->optimize = ONIG_OPTIMIZE_EXACT;\r
+ }\r
+ }\r
+\r
+ reg->dmin = e->mmd.min;\r
+ reg->dmax = e->mmd.max;\r
+\r
+ if (reg->dmin != ONIG_INFINITE_DISTANCE) {\r
+ reg->threshold_len = reg->dmin + (int)(reg->exact_end - reg->exact);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static void\r
+set_optimize_map_info(regex_t* reg, OptMapInfo* m)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\r
+ reg->map[i] = m->map[i];\r
+\r
+ reg->optimize = ONIG_OPTIMIZE_MAP;\r
+ reg->dmin = m->mmd.min;\r
+ reg->dmax = m->mmd.max;\r
+\r
+ if (reg->dmin != ONIG_INFINITE_DISTANCE) {\r
+ reg->threshold_len = reg->dmin + 1;\r
+ }\r
+}\r
+\r
+static void\r
+set_sub_anchor(regex_t* reg, OptAncInfo* anc)\r
+{\r
+ reg->sub_anchor |= anc->left_anchor & ANCHOR_BEGIN_LINE;\r
+ reg->sub_anchor |= anc->right_anchor & ANCHOR_END_LINE;\r
+}\r
+\r
+#ifdef ONIG_DEBUG\r
+static void print_optimize_info(FILE* f, regex_t* reg);\r
+#endif\r
+\r
+static int\r
+set_optimize_info_from_tree(Node* node, regex_t* reg, ScanEnv* scan_env)\r
+{\r
+\r
+ int r;\r
+ NodeOptInfo opt;\r
+ OptEnv env;\r
+\r
+ env.enc = reg->enc;\r
+ env.options = reg->options;\r
+ env.case_fold_flag = reg->case_fold_flag;\r
+ env.scan_env = scan_env;\r
+ clear_mml(&env.mmd);\r
+\r
+ r = optimize_node_left(node, &opt, &env);\r
+ if (r) return r;\r
+\r
+ reg->anchor = opt.anc.left_anchor & (ANCHOR_BEGIN_BUF |\r
+ ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML);\r
+\r
+ reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF);\r
+\r
+ if (reg->anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)) {\r
+ reg->anchor_dmin = opt.len.min;\r
+ reg->anchor_dmax = opt.len.max;\r
+ }\r
+\r
+ if (opt.exb.len > 0 || opt.exm.len > 0) {\r
+ select_opt_exact_info(reg->enc, &opt.exb, &opt.exm);\r
+ if (opt.map.value > 0 &&\r
+ comp_opt_exact_or_map_info(&opt.exb, &opt.map) > 0) {\r
+ goto set_map;\r
+ }\r
+ else {\r
+ r = set_optimize_exact_info(reg, &opt.exb);\r
+ set_sub_anchor(reg, &opt.exb.anc);\r
+ }\r
+ }\r
+ else if (opt.map.value > 0) {\r
+ set_map:\r
+ set_optimize_map_info(reg, &opt.map);\r
+ set_sub_anchor(reg, &opt.map.anc);\r
+ }\r
+ else {\r
+ reg->sub_anchor |= opt.anc.left_anchor & ANCHOR_BEGIN_LINE;\r
+ if (opt.len.max == 0)\r
+ reg->sub_anchor |= opt.anc.right_anchor & ANCHOR_END_LINE;\r
+ }\r
+\r
+#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH)\r
+ print_optimize_info(stderr, reg);\r
+#endif\r
+ return r;\r
+}\r
+\r
+static void\r
+clear_optimize_info(regex_t* reg)\r
+{\r
+ reg->optimize = ONIG_OPTIMIZE_NONE;\r
+ reg->anchor = 0;\r
+ reg->anchor_dmin = 0;\r
+ reg->anchor_dmax = 0;\r
+ reg->sub_anchor = 0;\r
+ reg->exact_end = (UChar* )NULL;\r
+ reg->threshold_len = 0;\r
+ if (IS_NOT_NULL(reg->exact)) {\r
+ xfree(reg->exact);\r
+ reg->exact = (UChar* )NULL;\r
+ }\r
+}\r
+\r
+#ifdef ONIG_DEBUG\r
+\r
+static void print_enc_string(FILE* fp, OnigEncoding enc,\r
+ const UChar *s, const UChar *end)\r
+{\r
+ fprintf(fp, "\nPATTERN: /");\r
+\r
+ if (ONIGENC_MBC_MINLEN(enc) > 1) {\r
+ const UChar *p;\r
+ OnigCodePoint code;\r
+\r
+ p = s;\r
+ while (p < end) {\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ if (code >= 0x80) {\r
+ fprintf(fp, " 0x%04x ", (int )code);\r
+ }\r
+ else {\r
+ fputc((int )code, fp);\r
+ }\r
+\r
+ p += enclen(enc, p);\r
+ }\r
+ }\r
+ else {\r
+ while (s < end) {\r
+ fputc((int )*s, fp);\r
+ s++;\r
+ }\r
+ }\r
+\r
+ fprintf(fp, "/\n");\r
+}\r
+\r
+static void\r
+print_distance_range(FILE* f, OnigDistance a, OnigDistance b)\r
+{\r
+ if (a == ONIG_INFINITE_DISTANCE)\r
+ fputs("inf", f);\r
+ else\r
+ fprintf(f, "(%u)", a);\r
+\r
+ fputs("-", f);\r
+\r
+ if (b == ONIG_INFINITE_DISTANCE)\r
+ fputs("inf", f);\r
+ else\r
+ fprintf(f, "(%u)", b);\r
+}\r
+\r
+static void\r
+print_anchor(FILE* f, int anchor)\r
+{\r
+ int q = 0;\r
+\r
+ fprintf(f, "[");\r
+\r
+ if (anchor & ANCHOR_BEGIN_BUF) {\r
+ fprintf(f, "begin-buf");\r
+ q = 1;\r
+ }\r
+ if (anchor & ANCHOR_BEGIN_LINE) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "begin-line");\r
+ }\r
+ if (anchor & ANCHOR_BEGIN_POSITION) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "begin-pos");\r
+ }\r
+ if (anchor & ANCHOR_END_BUF) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "end-buf");\r
+ }\r
+ if (anchor & ANCHOR_SEMI_END_BUF) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "semi-end-buf");\r
+ }\r
+ if (anchor & ANCHOR_END_LINE) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "end-line");\r
+ }\r
+ if (anchor & ANCHOR_ANYCHAR_STAR) {\r
+ if (q) fprintf(f, ", ");\r
+ q = 1;\r
+ fprintf(f, "anychar-star");\r
+ }\r
+ if (anchor & ANCHOR_ANYCHAR_STAR_ML) {\r
+ if (q) fprintf(f, ", ");\r
+ fprintf(f, "anychar-star-pl");\r
+ }\r
+\r
+ fprintf(f, "]");\r
+}\r
+\r
+static void\r
+print_optimize_info(FILE* f, regex_t* reg)\r
+{\r
+ static const char* on[] = { "NONE", "EXACT", "EXACT_BM", "EXACT_BM_NOT_REV",\r
+ "EXACT_IC", "MAP" };\r
+\r
+ fprintf(f, "optimize: %s\n", on[reg->optimize]);\r
+ fprintf(f, " anchor: "); print_anchor(f, reg->anchor);\r
+ if ((reg->anchor & ANCHOR_END_BUF_MASK) != 0)\r
+ print_distance_range(f, reg->anchor_dmin, reg->anchor_dmax);\r
+ fprintf(f, "\n");\r
+\r
+ if (reg->optimize) {\r
+ fprintf(f, " sub anchor: "); print_anchor(f, reg->sub_anchor);\r
+ fprintf(f, "\n");\r
+ }\r
+ fprintf(f, "\n");\r
+\r
+ if (reg->exact) {\r
+ UChar *p;\r
+ fprintf(f, "exact: [");\r
+ for (p = reg->exact; p < reg->exact_end; p++) {\r
+ fputc(*p, f);\r
+ }\r
+ fprintf(f, "]: length: %d\n", (reg->exact_end - reg->exact));\r
+ }\r
+ else if (reg->optimize & ONIG_OPTIMIZE_MAP) {\r
+ int c, i, n = 0;\r
+\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\r
+ if (reg->map[i]) n++;\r
+\r
+ fprintf(f, "map: n=%d\n", n);\r
+ if (n > 0) {\r
+ c = 0;\r
+ fputc('[', f);\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {\r
+ if (reg->map[i] != 0) {\r
+ if (c > 0) fputs(", ", f);\r
+ c++;\r
+ if (ONIGENC_MBC_MAXLEN(reg->enc) == 1 &&\r
+ ONIGENC_IS_CODE_PRINT(reg->enc, (OnigCodePoint )i))\r
+ fputc(i, f);\r
+ else\r
+ fprintf(f, "%d", i);\r
+ }\r
+ }\r
+ fprintf(f, "]\n");\r
+ }\r
+ }\r
+}\r
+#endif /* ONIG_DEBUG */\r
+\r
+\r
+extern void\r
+onig_free_body(regex_t* reg)\r
+{\r
+ if (IS_NOT_NULL(reg)) {\r
+ if (IS_NOT_NULL(reg->p)) xfree(reg->p);\r
+ if (IS_NOT_NULL(reg->exact)) xfree(reg->exact);\r
+ if (IS_NOT_NULL(reg->int_map)) xfree(reg->int_map);\r
+ if (IS_NOT_NULL(reg->int_map_backward)) xfree(reg->int_map_backward);\r
+ if (IS_NOT_NULL(reg->repeat_range)) xfree(reg->repeat_range);\r
+ if (IS_NOT_NULL(reg->chain)) onig_free(reg->chain);\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ onig_names_free(reg);\r
+#endif\r
+ }\r
+}\r
+\r
+extern void\r
+onig_free(regex_t* reg)\r
+{\r
+ if (IS_NOT_NULL(reg)) {\r
+ onig_free_body(reg);\r
+ xfree(reg);\r
+ }\r
+}\r
+\r
+#define REGEX_TRANSFER(to,from) do {\\r
+ (to)->state = ONIG_STATE_MODIFY;\\r
+ onig_free_body(to);\\r
+ xmemcpy(to, from, sizeof(regex_t));\\r
+ xfree(from);\\r
+} while (0)\r
+\r
+extern void\r
+onig_transfer(regex_t* to, regex_t* from)\r
+{\r
+ THREAD_ATOMIC_START;\r
+ REGEX_TRANSFER(to, from);\r
+ THREAD_ATOMIC_END;\r
+}\r
+\r
+#define REGEX_CHAIN_HEAD(reg) do {\\r
+ while (IS_NOT_NULL((reg)->chain)) {\\r
+ (reg) = (reg)->chain;\\r
+ }\\r
+} while (0)\r
+\r
+extern void\r
+onig_chain_link_add(regex_t* to, regex_t* add)\r
+{\r
+ THREAD_ATOMIC_START;\r
+ REGEX_CHAIN_HEAD(to);\r
+ to->chain = add;\r
+ THREAD_ATOMIC_END;\r
+}\r
+\r
+extern void\r
+onig_chain_reduce(regex_t* reg)\r
+{\r
+ regex_t *head, *prev;\r
+\r
+ prev = reg;\r
+ head = prev->chain;\r
+ if (IS_NOT_NULL(head)) {\r
+ reg->state = ONIG_STATE_MODIFY;\r
+ while (IS_NOT_NULL(head->chain)) {\r
+ prev = head;\r
+ head = head->chain;\r
+ }\r
+ prev->chain = (regex_t* )NULL;\r
+ REGEX_TRANSFER(reg, head);\r
+ }\r
+}\r
+\r
+#ifdef ONIG_DEBUG\r
+static void print_compiled_byte_code_list P_((FILE* f, regex_t* reg));\r
+#endif\r
+#ifdef ONIG_DEBUG_PARSE_TREE\r
+static void print_tree P_((FILE* f, Node* node));\r
+#endif\r
+\r
+extern int\r
+onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,\r
+ OnigErrorInfo* einfo)\r
+{\r
+#define COMPILE_INIT_SIZE 20\r
+\r
+ int r, init_size;\r
+ Node* root;\r
+ ScanEnv scan_env;\r
+#ifdef USE_SUBEXP_CALL\r
+ UnsetAddrList uslist;\r
+#endif\r
+\r
+ if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL;\r
+\r
+ reg->state = ONIG_STATE_COMPILING;\r
+\r
+#ifdef ONIG_DEBUG\r
+ print_enc_string(stderr, reg->enc, pattern, pattern_end);\r
+#endif\r
+\r
+ if (reg->alloc == 0) {\r
+ init_size = ((int)(pattern_end - pattern)) * 2;\r
+ if (init_size <= 0) init_size = COMPILE_INIT_SIZE;\r
+ r = BBUF_INIT(reg, init_size);\r
+ if (r != 0) goto end;\r
+ }\r
+ else\r
+ reg->used = 0;\r
+\r
+ reg->num_mem = 0;\r
+ reg->num_repeat = 0;\r
+ reg->num_null_check = 0;\r
+ reg->repeat_range_alloc = 0;\r
+ reg->repeat_range = (OnigRepeatRange* )NULL;\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ reg->num_comb_exp_check = 0;\r
+#endif\r
+\r
+ r = onig_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env);\r
+ if (r != 0) goto err;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ /* mixed use named group and no-named group */\r
+ if (scan_env.num_named > 0 &&\r
+ IS_SYNTAX_BV(scan_env.syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\r
+ !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {\r
+ if (scan_env.num_named != scan_env.num_mem)\r
+ r = disable_noname_group_capture(&root, reg, &scan_env);\r
+ else\r
+ r = numbered_ref_check(root);\r
+\r
+ if (r != 0) goto err;\r
+ }\r
+#endif\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ if (scan_env.num_call > 0) {\r
+ r = unset_addr_list_init(&uslist, scan_env.num_call);\r
+ if (r != 0) goto err;\r
+ scan_env.unset_addr_list = &uslist;\r
+ r = setup_subexp_call(root, &scan_env);\r
+ if (r != 0) goto err_unset;\r
+ r = subexp_recursive_check_trav(root, &scan_env);\r
+ if (r < 0) goto err_unset;\r
+ r = subexp_inf_recursive_check_trav(root, &scan_env);\r
+ if (r != 0) goto err_unset;\r
+\r
+ reg->num_call = scan_env.num_call;\r
+ }\r
+ else\r
+ reg->num_call = 0;\r
+#endif\r
+\r
+ r = setup_tree(root, reg, 0, &scan_env);\r
+ if (r != 0) goto err_unset;\r
+\r
+#ifdef ONIG_DEBUG_PARSE_TREE\r
+ print_tree(stderr, root);\r
+#endif\r
+\r
+ reg->capture_history = scan_env.capture_history;\r
+ reg->bt_mem_start = scan_env.bt_mem_start;\r
+ reg->bt_mem_start |= reg->capture_history;\r
+ if (IS_FIND_CONDITION(reg->options))\r
+ BIT_STATUS_ON_ALL(reg->bt_mem_end);\r
+ else {\r
+ reg->bt_mem_end = scan_env.bt_mem_end;\r
+ reg->bt_mem_end |= reg->capture_history;\r
+ }\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ if (scan_env.backrefed_mem == 0\r
+#ifdef USE_SUBEXP_CALL\r
+ || scan_env.num_call == 0\r
+#endif\r
+ ) {\r
+ setup_comb_exp_check(root, 0, &scan_env);\r
+#ifdef USE_SUBEXP_CALL\r
+ if (scan_env.has_recursion != 0) {\r
+ scan_env.num_comb_exp_check = 0;\r
+ }\r
+ else\r
+#endif\r
+ if (scan_env.comb_exp_max_regnum > 0) {\r
+ int i;\r
+ for (i = 1; i <= scan_env.comb_exp_max_regnum; i++) {\r
+ if (BIT_STATUS_AT(scan_env.backrefed_mem, i) != 0) {\r
+ scan_env.num_comb_exp_check = 0;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ reg->num_comb_exp_check = scan_env.num_comb_exp_check;\r
+#endif\r
+\r
+ clear_optimize_info(reg);\r
+#ifndef ONIG_DONT_OPTIMIZE\r
+ r = set_optimize_info_from_tree(root, reg, &scan_env);\r
+ if (r != 0) goto err_unset;\r
+#endif\r
+\r
+ if (IS_NOT_NULL(scan_env.mem_nodes_dynamic)) {\r
+ xfree(scan_env.mem_nodes_dynamic);\r
+ scan_env.mem_nodes_dynamic = (Node** )NULL;\r
+ }\r
+\r
+ r = compile_tree(root, reg);\r
+ if (r == 0) {\r
+ r = add_opcode(reg, OP_END);\r
+#ifdef USE_SUBEXP_CALL\r
+ if (scan_env.num_call > 0) {\r
+ r = unset_addr_list_fix(&uslist, reg);\r
+ unset_addr_list_end(&uslist);\r
+ if (r) goto err;\r
+ }\r
+#endif\r
+\r
+ if ((reg->num_repeat != 0) || (reg->bt_mem_end != 0))\r
+ reg->stack_pop_level = STACK_POP_LEVEL_ALL;\r
+ else {\r
+ if (reg->bt_mem_start != 0)\r
+ reg->stack_pop_level = STACK_POP_LEVEL_MEM_START;\r
+ else\r
+ reg->stack_pop_level = STACK_POP_LEVEL_FREE;\r
+ }\r
+ }\r
+#ifdef USE_SUBEXP_CALL\r
+ else if (scan_env.num_call > 0) {\r
+ unset_addr_list_end(&uslist);\r
+ }\r
+#endif\r
+ onig_node_free(root);\r
+\r
+#ifdef ONIG_DEBUG_COMPILE\r
+#ifdef USE_NAMED_GROUP\r
+ onig_print_names(stderr, reg);\r
+#endif\r
+ print_compiled_byte_code_list(stderr, reg);\r
+#endif\r
+\r
+ end:\r
+ reg->state = ONIG_STATE_NORMAL;\r
+ return r;\r
+\r
+ err_unset:\r
+#ifdef USE_SUBEXP_CALL\r
+ if (scan_env.num_call > 0) {\r
+ unset_addr_list_end(&uslist);\r
+ }\r
+#endif\r
+ err:\r
+ if (IS_NOT_NULL(scan_env.error)) {\r
+ if (IS_NOT_NULL(einfo)) {\r
+ einfo->enc = scan_env.enc;\r
+ einfo->par = scan_env.error;\r
+ einfo->par_end = scan_env.error_end;\r
+ }\r
+ }\r
+\r
+ onig_node_free(root);\r
+ if (IS_NOT_NULL(scan_env.mem_nodes_dynamic))\r
+ xfree(scan_env.mem_nodes_dynamic);\r
+ return r;\r
+}\r
+\r
+#ifdef USE_RECOMPILE_API\r
+extern int\r
+onig_recompile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,\r
+ OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\r
+ OnigErrorInfo* einfo)\r
+{\r
+ int r;\r
+ regex_t *new_reg;\r
+\r
+ r = onig_new(&new_reg, pattern, pattern_end, option, enc, syntax, einfo);\r
+ if (r) return r;\r
+ if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\r
+ onig_transfer(reg, new_reg);\r
+ }\r
+ else {\r
+ onig_chain_link_add(reg, new_reg);\r
+ }\r
+ return 0;\r
+}\r
+#endif\r
+\r
+static int onig_inited = 0;\r
+\r
+extern int\r
+onig_reg_init(regex_t* reg, OnigOptionType option,\r
+ OnigCaseFoldType case_fold_flag,\r
+ OnigEncoding enc, OnigSyntaxType* syntax)\r
+{\r
+ if (! onig_inited)\r
+ onig_init();\r
+\r
+ if (IS_NULL(reg))\r
+ return ONIGERR_INVALID_ARGUMENT;\r
+\r
+ if (ONIGENC_IS_UNDEF(enc))\r
+ return ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED;\r
+\r
+ if ((option & (ONIG_OPTION_DONT_CAPTURE_GROUP|ONIG_OPTION_CAPTURE_GROUP))\r
+ == (ONIG_OPTION_DONT_CAPTURE_GROUP|ONIG_OPTION_CAPTURE_GROUP)) {\r
+ return ONIGERR_INVALID_COMBINATION_OF_OPTIONS;\r
+ }\r
+\r
+ (reg)->state = ONIG_STATE_MODIFY;\r
+\r
+ if ((option & ONIG_OPTION_NEGATE_SINGLELINE) != 0) {\r
+ option |= syntax->options;\r
+ option &= ~ONIG_OPTION_SINGLELINE;\r
+ }\r
+ else\r
+ option |= syntax->options;\r
+\r
+ (reg)->enc = enc;\r
+ (reg)->options = option;\r
+ (reg)->syntax = syntax;\r
+ (reg)->optimize = 0;\r
+ (reg)->exact = (UChar* )NULL;\r
+ (reg)->int_map = (int* )NULL;\r
+ (reg)->int_map_backward = (int* )NULL;\r
+ (reg)->chain = (regex_t* )NULL;\r
+\r
+ (reg)->p = (UChar* )NULL;\r
+ (reg)->alloc = 0;\r
+ (reg)->used = 0;\r
+ (reg)->name_table = (void* )NULL;\r
+\r
+ (reg)->case_fold_flag = case_fold_flag;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_new_without_alloc(regex_t* reg, const UChar* pattern,\r
+ const UChar* pattern_end, OnigOptionType option, OnigEncoding enc,\r
+ OnigSyntaxType* syntax, OnigErrorInfo* einfo)\r
+{\r
+ int r;\r
+\r
+ r = onig_reg_init(reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);\r
+ if (r) return r;\r
+\r
+ r = onig_compile(reg, pattern, pattern_end, einfo);\r
+ return r;\r
+}\r
+\r
+extern int\r
+onig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\r
+ OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\r
+ OnigErrorInfo* einfo)\r
+{\r
+ int r;\r
+\r
+ *reg = (regex_t* )xmalloc(sizeof(regex_t));\r
+ if (IS_NULL(*reg)) return ONIGERR_MEMORY;\r
+\r
+ r = onig_reg_init(*reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);\r
+ if (r) goto err;\r
+\r
+ r = onig_compile(*reg, pattern, pattern_end, einfo);\r
+ if (r) {\r
+ err:\r
+ onig_free(*reg);\r
+ *reg = NULL;\r
+ }\r
+ return r;\r
+}\r
+\r
+\r
+extern int\r
+onig_init(void)\r
+{\r
+ if (onig_inited != 0)\r
+ return 0;\r
+\r
+ THREAD_SYSTEM_INIT;\r
+ THREAD_ATOMIC_START;\r
+\r
+ onig_inited = 1;\r
+\r
+ onigenc_init();\r
+ /* onigenc_set_default_caseconv_table((UChar* )0); */\r
+\r
+#ifdef ONIG_DEBUG_STATISTICS\r
+ onig_statistics_init();\r
+#endif\r
+\r
+ THREAD_ATOMIC_END;\r
+ return 0;\r
+}\r
+\r
+\r
+static OnigEndCallListItemType* EndCallTop;\r
+\r
+extern void onig_add_end_call(void (*func)(void))\r
+{\r
+ OnigEndCallListItemType* item;\r
+\r
+ item = (OnigEndCallListItemType* )xmalloc(sizeof(*item));\r
+ if (item == 0) return ;\r
+\r
+ item->next = EndCallTop;\r
+ item->func = func;\r
+\r
+ EndCallTop = item;\r
+}\r
+\r
+static void\r
+exec_end_call_list(void)\r
+{\r
+ OnigEndCallListItemType* prev;\r
+ void (*func)(void);\r
+\r
+ while (EndCallTop != 0) {\r
+ func = EndCallTop->func;\r
+ (*func)();\r
+\r
+ prev = EndCallTop;\r
+ EndCallTop = EndCallTop->next;\r
+ xfree(prev);\r
+ }\r
+}\r
+\r
+extern int\r
+onig_end(void)\r
+{\r
+ THREAD_ATOMIC_START;\r
+\r
+ exec_end_call_list();\r
+\r
+#ifdef ONIG_DEBUG_STATISTICS\r
+ onig_print_statistics(stderr);\r
+#endif\r
+\r
+#ifdef USE_SHARED_CCLASS_TABLE\r
+ onig_free_shared_cclass_table();\r
+#endif\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+ onig_free_node_list();\r
+#endif\r
+\r
+ onig_inited = 0;\r
+\r
+ THREAD_ATOMIC_END;\r
+ THREAD_SYSTEM_END;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_is_in_code_range(const UChar* p, OnigCodePoint code)\r
+{\r
+ OnigCodePoint n, *data;\r
+ OnigCodePoint low, high, x;\r
+\r
+ GET_CODE_POINT(n, p);\r
+ data = (OnigCodePoint* )p;\r
+ data++;\r
+\r
+ for (low = 0, high = n; low < high; ) {\r
+ x = (low + high) >> 1;\r
+ if (code > data[x * 2 + 1])\r
+ low = x + 1;\r
+ else\r
+ high = x;\r
+ }\r
+\r
+ return ((low < n && code >= data[low * 2]) ? 1 : 0);\r
+}\r
+\r
+extern int\r
+onig_is_code_in_cc_len(int elen, OnigCodePoint code, CClassNode* cc)\r
+{\r
+ int found;\r
+\r
+ if (elen > 1 || (code >= SINGLE_BYTE_SIZE)) {\r
+ if (IS_NULL(cc->mbuf)) {\r
+ found = 0;\r
+ }\r
+ else {\r
+ found = (onig_is_in_code_range(cc->mbuf->p, code) != 0 ? 1 : 0);\r
+ }\r
+ }\r
+ else {\r
+ found = (BITSET_AT(cc->bs, code) == 0 ? 0 : 1);\r
+ }\r
+\r
+ if (IS_NCCLASS_NOT(cc))\r
+ return !found;\r
+ else\r
+ return found;\r
+}\r
+\r
+extern int\r
+onig_is_code_in_cc(OnigEncoding enc, OnigCodePoint code, CClassNode* cc)\r
+{\r
+ int len;\r
+\r
+ if (ONIGENC_MBC_MINLEN(enc) > 1) {\r
+ len = 2;\r
+ }\r
+ else {\r
+ len = ONIGENC_CODE_TO_MBCLEN(enc, code);\r
+ }\r
+ return onig_is_code_in_cc_len(len, code, cc);\r
+}\r
+\r
+\r
+#ifdef ONIG_DEBUG\r
+\r
+/* arguments type */\r
+#define ARG_SPECIAL -1\r
+#define ARG_NON 0\r
+#define ARG_RELADDR 1\r
+#define ARG_ABSADDR 2\r
+#define ARG_LENGTH 3\r
+#define ARG_MEMNUM 4\r
+#define ARG_OPTION 5\r
+#define ARG_STATE_CHECK 6\r
+\r
+OnigOpInfoType OnigOpInfo[] = {\r
+ { OP_FINISH, "finish", ARG_NON },\r
+ { OP_END, "end", ARG_NON },\r
+ { OP_EXACT1, "exact1", ARG_SPECIAL },\r
+ { OP_EXACT2, "exact2", ARG_SPECIAL },\r
+ { OP_EXACT3, "exact3", ARG_SPECIAL },\r
+ { OP_EXACT4, "exact4", ARG_SPECIAL },\r
+ { OP_EXACT5, "exact5", ARG_SPECIAL },\r
+ { OP_EXACTN, "exactn", ARG_SPECIAL },\r
+ { OP_EXACTMB2N1, "exactmb2-n1", ARG_SPECIAL },\r
+ { OP_EXACTMB2N2, "exactmb2-n2", ARG_SPECIAL },\r
+ { OP_EXACTMB2N3, "exactmb2-n3", ARG_SPECIAL },\r
+ { OP_EXACTMB2N, "exactmb2-n", ARG_SPECIAL },\r
+ { OP_EXACTMB3N, "exactmb3n" , ARG_SPECIAL },\r
+ { OP_EXACTMBN, "exactmbn", ARG_SPECIAL },\r
+ { OP_EXACT1_IC, "exact1-ic", ARG_SPECIAL },\r
+ { OP_EXACTN_IC, "exactn-ic", ARG_SPECIAL },\r
+ { OP_CCLASS, "cclass", ARG_SPECIAL },\r
+ { OP_CCLASS_MB, "cclass-mb", ARG_SPECIAL },\r
+ { OP_CCLASS_MIX, "cclass-mix", ARG_SPECIAL },\r
+ { OP_CCLASS_NOT, "cclass-not", ARG_SPECIAL },\r
+ { OP_CCLASS_MB_NOT, "cclass-mb-not", ARG_SPECIAL },\r
+ { OP_CCLASS_MIX_NOT, "cclass-mix-not", ARG_SPECIAL },\r
+ { OP_CCLASS_NODE, "cclass-node", ARG_SPECIAL },\r
+ { OP_ANYCHAR, "anychar", ARG_NON },\r
+ { OP_ANYCHAR_ML, "anychar-ml", ARG_NON },\r
+ { OP_ANYCHAR_STAR, "anychar*", ARG_NON },\r
+ { OP_ANYCHAR_ML_STAR, "anychar-ml*", ARG_NON },\r
+ { OP_ANYCHAR_STAR_PEEK_NEXT, "anychar*-peek-next", ARG_SPECIAL },\r
+ { OP_ANYCHAR_ML_STAR_PEEK_NEXT, "anychar-ml*-peek-next", ARG_SPECIAL },\r
+ { OP_WORD, "word", ARG_NON },\r
+ { OP_NOT_WORD, "not-word", ARG_NON },\r
+ { OP_WORD_BOUND, "word-bound", ARG_NON },\r
+ { OP_NOT_WORD_BOUND, "not-word-bound", ARG_NON },\r
+ { OP_WORD_BEGIN, "word-begin", ARG_NON },\r
+ { OP_WORD_END, "word-end", ARG_NON },\r
+ { OP_BEGIN_BUF, "begin-buf", ARG_NON },\r
+ { OP_END_BUF, "end-buf", ARG_NON },\r
+ { OP_BEGIN_LINE, "begin-line", ARG_NON },\r
+ { OP_END_LINE, "end-line", ARG_NON },\r
+ { OP_SEMI_END_BUF, "semi-end-buf", ARG_NON },\r
+ { OP_BEGIN_POSITION, "begin-position", ARG_NON },\r
+ { OP_BACKREF1, "backref1", ARG_NON },\r
+ { OP_BACKREF2, "backref2", ARG_NON },\r
+ { OP_BACKREFN, "backrefn", ARG_MEMNUM },\r
+ { OP_BACKREFN_IC, "backrefn-ic", ARG_SPECIAL },\r
+ { OP_BACKREF_MULTI, "backref_multi", ARG_SPECIAL },\r
+ { OP_BACKREF_MULTI_IC, "backref_multi-ic", ARG_SPECIAL },\r
+ { OP_BACKREF_WITH_LEVEL, "backref_at_level", ARG_SPECIAL },\r
+ { OP_MEMORY_START_PUSH, "mem-start-push", ARG_MEMNUM },\r
+ { OP_MEMORY_START, "mem-start", ARG_MEMNUM },\r
+ { OP_MEMORY_END_PUSH, "mem-end-push", ARG_MEMNUM },\r
+ { OP_MEMORY_END_PUSH_REC, "mem-end-push-rec", ARG_MEMNUM },\r
+ { OP_MEMORY_END, "mem-end", ARG_MEMNUM },\r
+ { OP_MEMORY_END_REC, "mem-end-rec", ARG_MEMNUM },\r
+ { OP_SET_OPTION_PUSH, "set-option-push", ARG_OPTION },\r
+ { OP_SET_OPTION, "set-option", ARG_OPTION },\r
+ { OP_FAIL, "fail", ARG_NON },\r
+ { OP_JUMP, "jump", ARG_RELADDR },\r
+ { OP_PUSH, "push", ARG_RELADDR },\r
+ { OP_POP, "pop", ARG_NON },\r
+ { OP_PUSH_OR_JUMP_EXACT1, "push-or-jump-e1", ARG_SPECIAL },\r
+ { OP_PUSH_IF_PEEK_NEXT, "push-if-peek-next", ARG_SPECIAL },\r
+ { OP_REPEAT, "repeat", ARG_SPECIAL },\r
+ { OP_REPEAT_NG, "repeat-ng", ARG_SPECIAL },\r
+ { OP_REPEAT_INC, "repeat-inc", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_NG, "repeat-inc-ng", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_SG, "repeat-inc-sg", ARG_MEMNUM },\r
+ { OP_REPEAT_INC_NG_SG, "repeat-inc-ng-sg", ARG_MEMNUM },\r
+ { OP_NULL_CHECK_START, "null-check-start", ARG_MEMNUM },\r
+ { OP_NULL_CHECK_END, "null-check-end", ARG_MEMNUM },\r
+ { OP_NULL_CHECK_END_MEMST,"null-check-end-memst", ARG_MEMNUM },\r
+ { OP_NULL_CHECK_END_MEMST_PUSH,"null-check-end-memst-push", ARG_MEMNUM },\r
+ { OP_PUSH_POS, "push-pos", ARG_NON },\r
+ { OP_POP_POS, "pop-pos", ARG_NON },\r
+ { OP_PUSH_POS_NOT, "push-pos-not", ARG_RELADDR },\r
+ { OP_FAIL_POS, "fail-pos", ARG_NON },\r
+ { OP_PUSH_STOP_BT, "push-stop-bt", ARG_NON },\r
+ { OP_POP_STOP_BT, "pop-stop-bt", ARG_NON },\r
+ { OP_LOOK_BEHIND, "look-behind", ARG_SPECIAL },\r
+ { OP_PUSH_LOOK_BEHIND_NOT, "push-look-behind-not", ARG_SPECIAL },\r
+ { OP_FAIL_LOOK_BEHIND_NOT, "fail-look-behind-not", ARG_NON },\r
+ { OP_CALL, "call", ARG_ABSADDR },\r
+ { OP_RETURN, "return", ARG_NON },\r
+ { OP_STATE_CHECK_PUSH, "state-check-push", ARG_SPECIAL },\r
+ { OP_STATE_CHECK_PUSH_OR_JUMP, "state-check-push-or-jump", ARG_SPECIAL },\r
+ { OP_STATE_CHECK, "state-check", ARG_STATE_CHECK },\r
+ { OP_STATE_CHECK_ANYCHAR_STAR, "state-check-anychar*", ARG_STATE_CHECK },\r
+ { OP_STATE_CHECK_ANYCHAR_ML_STAR,\r
+ "state-check-anychar-ml*", ARG_STATE_CHECK },\r
+ { -1, "", ARG_NON }\r
+};\r
+\r
+static char*\r
+op2name(int opcode)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\r
+ if (opcode == OnigOpInfo[i].opcode)\r
+ return OnigOpInfo[i].name;\r
+ }\r
+ return "";\r
+}\r
+\r
+static int\r
+op2arg_type(int opcode)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\r
+ if (opcode == OnigOpInfo[i].opcode)\r
+ return OnigOpInfo[i].arg_type;\r
+ }\r
+ return ARG_SPECIAL;\r
+}\r
+\r
+static void\r
+Indent(FILE* f, int indent)\r
+{\r
+ int i;\r
+ for (i = 0; i < indent; i++) putc(' ', f);\r
+}\r
+\r
+static void\r
+p_string(FILE* f, int len, UChar* s)\r
+{\r
+ fputs(":", f);\r
+ while (len-- > 0) { fputc(*s++, f); }\r
+}\r
+\r
+static void\r
+p_len_string(FILE* f, LengthType len, int mb_len, UChar* s)\r
+{\r
+ int x = len * mb_len;\r
+\r
+ fprintf(f, ":%d:", len);\r
+ while (x-- > 0) { fputc(*s++, f); }\r
+}\r
+\r
+extern void\r
+onig_print_compiled_byte_code(FILE* f, UChar* bp, UChar** nextp,\r
+ OnigEncoding enc)\r
+{\r
+ int i, n, arg_type;\r
+ RelAddrType addr;\r
+ LengthType len;\r
+ MemNumType mem;\r
+ StateCheckNumType scn;\r
+ OnigCodePoint code;\r
+ UChar *q;\r
+\r
+ fprintf(f, "[%s", op2name(*bp));\r
+ arg_type = op2arg_type(*bp);\r
+ if (arg_type != ARG_SPECIAL) {\r
+ bp++;\r
+ switch (arg_type) {\r
+ case ARG_NON:\r
+ break;\r
+ case ARG_RELADDR:\r
+ GET_RELADDR_INC(addr, bp);\r
+ fprintf(f, ":(%d)", addr);\r
+ break;\r
+ case ARG_ABSADDR:\r
+ GET_ABSADDR_INC(addr, bp);\r
+ fprintf(f, ":(%d)", addr);\r
+ break;\r
+ case ARG_LENGTH:\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d", len);\r
+ break;\r
+ case ARG_MEMNUM:\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ fprintf(f, ":%d", mem);\r
+ break;\r
+ case ARG_OPTION:\r
+ {\r
+ OnigOptionType option = *((OnigOptionType* )bp);\r
+ bp += SIZE_OPTION;\r
+ fprintf(f, ":%d", option);\r
+ }\r
+ break;\r
+\r
+ case ARG_STATE_CHECK:\r
+ scn = *((StateCheckNumType* )bp);\r
+ bp += SIZE_STATE_CHECK_NUM;\r
+ fprintf(f, ":%d", scn);\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ switch (*bp++) {\r
+ case OP_EXACT1:\r
+ case OP_ANYCHAR_STAR_PEEK_NEXT:\r
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:\r
+ p_string(f, 1, bp++); break;\r
+ case OP_EXACT2:\r
+ p_string(f, 2, bp); bp += 2; break;\r
+ case OP_EXACT3:\r
+ p_string(f, 3, bp); bp += 3; break;\r
+ case OP_EXACT4:\r
+ p_string(f, 4, bp); bp += 4; break;\r
+ case OP_EXACT5:\r
+ p_string(f, 5, bp); bp += 5; break;\r
+ case OP_EXACTN:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 1, bp);\r
+ bp += len;\r
+ break;\r
+ \r
+ case OP_EXACTMB2N1:\r
+ p_string(f, 2, bp); bp += 2; break;\r
+ case OP_EXACTMB2N2:\r
+ p_string(f, 4, bp); bp += 4; break;\r
+ case OP_EXACTMB2N3:\r
+ p_string(f, 6, bp); bp += 6; break;\r
+ case OP_EXACTMB2N:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 2, bp);\r
+ bp += len * 2;\r
+ break;\r
+ case OP_EXACTMB3N:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 3, bp);\r
+ bp += len * 3;\r
+ break;\r
+ case OP_EXACTMBN:\r
+ {\r
+ int mb_len;\r
+ \r
+ GET_LENGTH_INC(mb_len, bp);\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d:%d:", mb_len, len);\r
+ n = len * mb_len;\r
+ while (n-- > 0) { fputc(*bp++, f); }\r
+ }\r
+ break;\r
+\r
+ case OP_EXACT1_IC:\r
+ len = enclen(enc, bp);\r
+ p_string(f, len, bp);\r
+ bp += len;\r
+ break;\r
+ case OP_EXACTN_IC:\r
+ GET_LENGTH_INC(len, bp);\r
+ p_len_string(f, len, 1, bp);\r
+ bp += len;\r
+ break;\r
+\r
+ case OP_CCLASS:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ fprintf(f, ":%d", n);\r
+ break;\r
+\r
+ case OP_CCLASS_NOT:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ fprintf(f, ":%d", n);\r
+ break;\r
+\r
+ case OP_CCLASS_MB:\r
+ case OP_CCLASS_MB_NOT:\r
+ GET_LENGTH_INC(len, bp);\r
+ q = bp;\r
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ ALIGNMENT_RIGHT(q);\r
+#endif\r
+ GET_CODE_POINT(code, q);\r
+ bp += len;\r
+ fprintf(f, ":%d:%d", (int )code, len);\r
+ break;\r
+\r
+ case OP_CCLASS_MIX:\r
+ case OP_CCLASS_MIX_NOT:\r
+ n = bitset_on_num((BitSetRef )bp);\r
+ bp += SIZE_BITSET;\r
+ GET_LENGTH_INC(len, bp);\r
+ q = bp;\r
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ ALIGNMENT_RIGHT(q);\r
+#endif\r
+ GET_CODE_POINT(code, q);\r
+ bp += len;\r
+ fprintf(f, ":%d:%d:%d", n, (int )code, len);\r
+ break;\r
+\r
+ case OP_CCLASS_NODE:\r
+ {\r
+ CClassNode *cc;\r
+\r
+ GET_POINTER_INC(cc, bp);\r
+ n = bitset_on_num(cc->bs);\r
+ fprintf(f, ":%u:%d", (unsigned int )cc, n);\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREFN_IC:\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ fprintf(f, ":%d", mem);\r
+ break;\r
+\r
+ case OP_BACKREF_MULTI_IC:\r
+ case OP_BACKREF_MULTI:\r
+ fputs(" ", f);\r
+ GET_LENGTH_INC(len, bp);\r
+ for (i = 0; i < len; i++) {\r
+ GET_MEMNUM_INC(mem, bp);\r
+ if (i > 0) fputs(", ", f);\r
+ fprintf(f, "%d", mem);\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREF_WITH_LEVEL:\r
+ {\r
+ OnigOptionType option;\r
+ LengthType level;\r
+\r
+ GET_OPTION_INC(option, bp);\r
+ fprintf(f, ":%d", option);\r
+ GET_LENGTH_INC(level, bp);\r
+ fprintf(f, ":%d", level);\r
+\r
+ fputs(" ", f);\r
+ GET_LENGTH_INC(len, bp);\r
+ for (i = 0; i < len; i++) {\r
+ GET_MEMNUM_INC(mem, bp);\r
+ if (i > 0) fputs(", ", f);\r
+ fprintf(f, "%d", mem);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case OP_REPEAT:\r
+ case OP_REPEAT_NG:\r
+ {\r
+ mem = *((MemNumType* )bp);\r
+ bp += SIZE_MEMNUM;\r
+ addr = *((RelAddrType* )bp);\r
+ bp += SIZE_RELADDR;\r
+ fprintf(f, ":%d:%d", mem, addr);\r
+ }\r
+ break;\r
+\r
+ case OP_PUSH_OR_JUMP_EXACT1:\r
+ case OP_PUSH_IF_PEEK_NEXT:\r
+ addr = *((RelAddrType* )bp);\r
+ bp += SIZE_RELADDR;\r
+ fprintf(f, ":(%d)", addr);\r
+ p_string(f, 1, bp);\r
+ bp += 1;\r
+ break;\r
+\r
+ case OP_LOOK_BEHIND:\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d", len);\r
+ break;\r
+\r
+ case OP_PUSH_LOOK_BEHIND_NOT:\r
+ GET_RELADDR_INC(addr, bp);\r
+ GET_LENGTH_INC(len, bp);\r
+ fprintf(f, ":%d:(%d)", len, addr);\r
+ break;\r
+\r
+ case OP_STATE_CHECK_PUSH:\r
+ case OP_STATE_CHECK_PUSH_OR_JUMP:\r
+ scn = *((StateCheckNumType* )bp);\r
+ bp += SIZE_STATE_CHECK_NUM;\r
+ addr = *((RelAddrType* )bp);\r
+ bp += SIZE_RELADDR;\r
+ fprintf(f, ":%d:(%d)", scn, addr);\r
+ break;\r
+\r
+ default:\r
+ fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n",\r
+ *--bp);\r
+ }\r
+ }\r
+ fputs("]", f);\r
+ if (nextp) *nextp = bp;\r
+}\r
+\r
+static void\r
+print_compiled_byte_code_list(FILE* f, regex_t* reg)\r
+{\r
+ int ncode;\r
+ UChar* bp = reg->p;\r
+ UChar* end = reg->p + reg->used;\r
+\r
+ fprintf(f, "code length: %d\n", reg->used);\r
+\r
+ ncode = 0;\r
+ while (bp < end) {\r
+ ncode++;\r
+ if (bp > reg->p) {\r
+ if (ncode % 5 == 0)\r
+ fprintf(f, "\n");\r
+ else\r
+ fputs(" ", f);\r
+ }\r
+ onig_print_compiled_byte_code(f, bp, &bp, reg->enc);\r
+ }\r
+\r
+ fprintf(f, "\n");\r
+}\r
+\r
+static void\r
+print_indent_tree(FILE* f, Node* node, int indent)\r
+{\r
+ int i, type;\r
+ int add = 3;\r
+ UChar* p;\r
+\r
+ Indent(f, indent);\r
+ if (IS_NULL(node)) {\r
+ fprintf(f, "ERROR: null node!!!\n");\r
+ exit (0);\r
+ }\r
+\r
+ type = NTYPE(node);\r
+ switch (type) {\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ if (NTYPE(node) == NT_LIST)\r
+ fprintf(f, "<list:%x>\n", (int )node);\r
+ else\r
+ fprintf(f, "<alt:%x>\n", (int )node);\r
+\r
+ print_indent_tree(f, NCAR(node), indent + add);\r
+ while (IS_NOT_NULL(node = NCDR(node))) {\r
+ if (NTYPE(node) != type) {\r
+ fprintf(f, "ERROR: list/alt right is not a cons. %d\n", NTYPE(node));\r
+ exit(0);\r
+ }\r
+ print_indent_tree(f, NCAR(node), indent + add);\r
+ }\r
+ break;\r
+\r
+ case NT_STR:\r
+ fprintf(f, "<string%s:%x>",\r
+ (NSTRING_IS_RAW(node) ? "-raw" : ""), (int )node);\r
+ for (p = NSTR(node)->s; p < NSTR(node)->end; p++) {\r
+ if (*p >= 0x20 && *p < 0x7f)\r
+ fputc(*p, f);\r
+ else {\r
+ fprintf(f, " 0x%02x", *p);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ fprintf(f, "<cclass:%x>", (int )node);\r
+ if (IS_NCCLASS_NOT(NCCLASS(node))) fputs(" not", f);\r
+ if (NCCLASS(node)->mbuf) {\r
+ BBuf* bbuf = NCCLASS(node)->mbuf;\r
+ for (i = 0; i < bbuf->used; i++) {\r
+ if (i > 0) fprintf(f, ",");\r
+ fprintf(f, "%0x", bbuf->p[i]);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_CTYPE:\r
+ fprintf(f, "<ctype:%x> ", (int )node);\r
+ switch (NCTYPE(node)->ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (NCTYPE(node)->not != 0)\r
+ fputs("not word", f);\r
+ else\r
+ fputs("word", f);\r
+ break;\r
+\r
+ default:\r
+ fprintf(f, "ERROR: undefined ctype.\n");\r
+ exit(0);\r
+ }\r
+ break;\r
+\r
+ case NT_CANY:\r
+ fprintf(f, "<anychar:%x>", (int )node);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ fprintf(f, "<anchor:%x> ", (int )node);\r
+ switch (NANCHOR(node)->type) {\r
+ case ANCHOR_BEGIN_BUF: fputs("begin buf", f); break;\r
+ case ANCHOR_END_BUF: fputs("end buf", f); break;\r
+ case ANCHOR_BEGIN_LINE: fputs("begin line", f); break;\r
+ case ANCHOR_END_LINE: fputs("end line", f); break;\r
+ case ANCHOR_SEMI_END_BUF: fputs("semi end buf", f); break;\r
+ case ANCHOR_BEGIN_POSITION: fputs("begin position", f); break;\r
+\r
+ case ANCHOR_WORD_BOUND: fputs("word bound", f); break;\r
+ case ANCHOR_NOT_WORD_BOUND: fputs("not word bound", f); break;\r
+#ifdef USE_WORD_BEGIN_END\r
+ case ANCHOR_WORD_BEGIN: fputs("word begin", f); break;\r
+ case ANCHOR_WORD_END: fputs("word end", f); break;\r
+#endif\r
+ case ANCHOR_PREC_READ: fputs("prec read", f); break;\r
+ case ANCHOR_PREC_READ_NOT: fputs("prec read not", f); break;\r
+ case ANCHOR_LOOK_BEHIND: fputs("look_behind", f); break;\r
+ case ANCHOR_LOOK_BEHIND_NOT: fputs("look_behind_not",f); break;\r
+\r
+ default:\r
+ fprintf(f, "ERROR: undefined anchor type.\n");\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case NT_BREF:\r
+ {\r
+ int* p;\r
+ BRefNode* br = NBREF(node);\r
+ p = BACKREFS_P(br);\r
+ fprintf(f, "<backref:%x>", (int )node);\r
+ for (i = 0; i < br->back_num; i++) {\r
+ if (i > 0) fputs(", ", f);\r
+ fprintf(f, "%d", p[i]);\r
+ }\r
+ }\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case NT_CALL:\r
+ {\r
+ CallNode* cn = NCALL(node);\r
+ fprintf(f, "<call:%x>", (int )node);\r
+ p_string(f, cn->name_end - cn->name, cn->name);\r
+ }\r
+ break;\r
+#endif\r
+\r
+ case NT_QTFR:\r
+ fprintf(f, "<quantifier:%x>{%d,%d}%s\n", (int )node,\r
+ NQTFR(node)->lower, NQTFR(node)->upper,\r
+ (NQTFR(node)->greedy ? "" : "?"));\r
+ print_indent_tree(f, NQTFR(node)->target, indent + add);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ fprintf(f, "<enclose:%x> ", (int )node);\r
+ switch (NENCLOSE(node)->type) {\r
+ case ENCLOSE_OPTION:\r
+ fprintf(f, "option:%d", NENCLOSE(node)->option);\r
+ break;\r
+ case ENCLOSE_MEMORY:\r
+ fprintf(f, "memory:%d", NENCLOSE(node)->regnum);\r
+ break;\r
+ case ENCLOSE_STOP_BACKTRACK:\r
+ fprintf(f, "stop-bt");\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ fprintf(f, "\n");\r
+ print_indent_tree(f, NENCLOSE(node)->target, indent + add);\r
+ break;\r
+\r
+ default:\r
+ fprintf(f, "print_indent_tree: undefined node type %d\n", NTYPE(node));\r
+ break;\r
+ }\r
+\r
+ if (type != NT_LIST && type != NT_ALT && type != NT_QTFR &&\r
+ type != NT_ENCLOSE)\r
+ fprintf(f, "\n");\r
+ fflush(f);\r
+}\r
+#endif /* ONIG_DEBUG */\r
+\r
+#ifdef ONIG_DEBUG_PARSE_TREE\r
+static void\r
+print_tree(FILE* f, Node* node)\r
+{\r
+ print_indent_tree(f, node, 0);\r
+}\r
+#endif\r
--- /dev/null
+/**********************************************************************\r
+ regenc.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ * \r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+OnigEncoding OnigEncDefaultCharEncoding = ONIG_ENCODING_INIT_DEFAULT;\r
+\r
+extern int\r
+onigenc_init(void)\r
+{\r
+ return 0;\r
+}\r
+\r
+extern OnigEncoding\r
+onigenc_get_default_encoding(void)\r
+{\r
+ return OnigEncDefaultCharEncoding;\r
+}\r
+\r
+extern int\r
+onigenc_set_default_encoding(OnigEncoding enc)\r
+{\r
+ OnigEncDefaultCharEncoding = enc;\r
+ return 0;\r
+}\r
+\r
+extern UChar*\r
+onigenc_get_right_adjust_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\r
+{\r
+ UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\r
+ if (p < s) {\r
+ p += enclen(enc, p);\r
+ }\r
+ return p;\r
+}\r
+\r
+extern UChar*\r
+onigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc,\r
+ const UChar* start, const UChar* s, const UChar** prev)\r
+{\r
+ UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\r
+\r
+ if (p < s) {\r
+ if (prev) *prev = (const UChar* )p;\r
+ p += enclen(enc, p);\r
+ }\r
+ else {\r
+ if (prev) *prev = (const UChar* )NULL; /* Sorry */\r
+ }\r
+ return p;\r
+}\r
+\r
+extern UChar*\r
+onigenc_get_prev_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\r
+{\r
+ if (s <= start)\r
+ return (UChar* )NULL;\r
+\r
+ return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);\r
+}\r
+\r
+extern UChar*\r
+onigenc_step_back(OnigEncoding enc, const UChar* start, const UChar* s, int n)\r
+{\r
+ while (ONIG_IS_NOT_NULL(s) && n-- > 0) {\r
+ if (s <= start)\r
+ return (UChar* )NULL;\r
+\r
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);\r
+ }\r
+ return (UChar* )s;\r
+}\r
+\r
+extern UChar*\r
+onigenc_step(OnigEncoding enc, const UChar* p, const UChar* end, int n)\r
+{\r
+ UChar* q = (UChar* )p;\r
+ while (n-- > 0) {\r
+ q += ONIGENC_MBC_ENC_LEN(enc, q);\r
+ }\r
+ return (q <= end ? q : NULL);\r
+}\r
+\r
+extern int\r
+onigenc_strlen(OnigEncoding enc, const UChar* p, const UChar* end)\r
+{\r
+ int n = 0;\r
+ UChar* q = (UChar* )p;\r
+ \r
+ while (q < end) {\r
+ q += ONIGENC_MBC_ENC_LEN(enc, q);\r
+ n++;\r
+ }\r
+ return n;\r
+}\r
+\r
+extern int\r
+onigenc_strlen_null(OnigEncoding enc, const UChar* s)\r
+{\r
+ int n = 0;\r
+ UChar* p = (UChar* )s;\r
+ \r
+ while (1) {\r
+ if (*p == '\0') {\r
+ UChar* q;\r
+ int len = ONIGENC_MBC_MINLEN(enc);\r
+\r
+ if (len == 1) return n;\r
+ q = p + 1;\r
+ while (len > 1) {\r
+ if (*q != '\0') break;\r
+ q++;\r
+ len--;\r
+ }\r
+ if (len == 1) return n;\r
+ }\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p);\r
+ n++;\r
+ }\r
+}\r
+\r
+extern int\r
+onigenc_str_bytelen_null(OnigEncoding enc, const UChar* s)\r
+{\r
+ UChar* start = (UChar* )s;\r
+ UChar* p = (UChar* )s;\r
+\r
+ while (1) {\r
+ if (*p == '\0') {\r
+ UChar* q;\r
+ int len = ONIGENC_MBC_MINLEN(enc);\r
+\r
+ if (len == 1) return (int )(p - start);\r
+ q = p + 1;\r
+ while (len > 1) {\r
+ if (*q != '\0') break;\r
+ q++;\r
+ len--;\r
+ }\r
+ if (len == 1) return (int )(p - start);\r
+ }\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p);\r
+ }\r
+}\r
+\r
+const UChar OnigEncAsciiToLowerCaseTable[] = {\r
+ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,\r
+ 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u,\r
+ 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u,\r
+ 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u,\r
+ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,\r
+ 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u,\r
+ 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u,\r
+ 70u, 71u, 72u, 73u, 74u, 75u, 76u, 77u,\r
+ 100u, 141u, 142u, 143u, 144u, 145u, 146u, 147u,\r
+ 150u, 151u, 152u, 153u, 154u, 155u, 156u, 157u,\r
+ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,\r
+ 170u, 171u, 172u, 133u, 134u, 135u, 136u, 137u,\r
+ 140u, 141u, 142u, 143u, 144u, 145u, 146u, 147u,\r
+ 150u, 151u, 152u, 153u, 154u, 155u, 156u, 157u,\r
+ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,\r
+ 170u, 171u, 172u, 173u, 174u, 175u, 176u, 177u,\r
+ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,\r
+ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,\r
+ 220u, 221u, 222u, 223u, 224u, 225u, 226u, 227u,\r
+ 230u, 231u, 232u, 233u, 234u, 235u, 236u, 237u,\r
+ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,\r
+ 250u, 251u, 252u, 253u, 254u, 255u, 256u, 257u,\r
+ 260u, 261u, 262u, 263u, 264u, 265u, 266u, 267u,\r
+ 270u, 271u, 272u, 273u, 274u, 275u, 276u, 277u,\r
+ 300u, 301u, 302u, 303u, 304u, 305u, 306u, 307u,\r
+ 310u, 311u, 312u, 313u, 314u, 315u, 316u, 317u,\r
+ 320u, 321u, 322u, 323u, 324u, 325u, 326u, 327u,\r
+ 330u, 331u, 332u, 333u, 334u, 335u, 336u, 337u,\r
+ 340u, 341u, 342u, 343u, 344u, 345u, 346u, 347u,\r
+ 350u, 351u, 352u, 353u, 354u, 355u, 356u, 357u,\r
+ 360u, 361u, 362u, 363u, 364u, 365u, 366u, 367u,\r
+ 370u, 371u, 372u, 373u, 374u, 375u, 376u, 377u,\r
+};\r
+\r
+#ifdef USE_UPPER_CASE_TABLE\r
+const UChar OnigEncAsciiToUpperCaseTable[256] = {\r
+ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,\r
+ 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u,\r
+ 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u,\r
+ 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u,\r
+ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,\r
+ 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u,\r
+ 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u,\r
+ 70u, 71u, 72u, 73u, 74u, 75u, 76u, 77u,\r
+ 100u, 101u, 102u, 103u, 104u, 105u, 106u, 107u,\r
+ 110u, 111u, 112u, 113u, 114u, 115u, 116u, 117u,\r
+ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,\r
+ 130u, 131u, 132u, 133u, 134u, 135u, 136u, 137u,\r
+ 140u, 101u, 102u, 103u, 104u, 105u, 106u, 107u,\r
+ 110u, 111u, 112u, 113u, 114u, 115u, 116u, 117u,\r
+ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,\r
+ 130u, 131u, 132u, 173u, 174u, 175u, 176u, 177u,\r
+ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,\r
+ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,\r
+ 220u, 221u, 222u, 223u, 224u, 225u, 226u, 227u,\r
+ 230u, 231u, 232u, 233u, 234u, 235u, 236u, 237u,\r
+ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,\r
+ 250u, 251u, 252u, 253u, 254u, 255u, 256u, 257u,\r
+ 260u, 261u, 262u, 263u, 264u, 265u, 266u, 267u,\r
+ 270u, 271u, 272u, 273u, 274u, 275u, 276u, 277u,\r
+ 300u, 301u, 302u, 303u, 304u, 305u, 306u, 307u,\r
+ 310u, 311u, 312u, 313u, 314u, 315u, 316u, 317u,\r
+ 320u, 321u, 322u, 323u, 324u, 325u, 326u, 327u,\r
+ 330u, 331u, 332u, 333u, 334u, 335u, 336u, 337u,\r
+ 340u, 341u, 342u, 343u, 344u, 345u, 346u, 347u,\r
+ 350u, 351u, 352u, 353u, 354u, 355u, 356u, 357u,\r
+ 360u, 361u, 362u, 363u, 364u, 365u, 366u, 367u,\r
+ 370u, 371u, 372u, 373u, 374u, 375u, 376u, 377u,\r
+};\r
+#endif\r
+\r
+const unsigned short OnigEncAsciiCtypeTable[256] = {\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\r
+ 0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\r
+ 0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\r
+ 0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\r
+ 0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\r
+ 0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\r
+ 0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000\r
+};\r
+\r
+const UChar OnigEncISO_8859_1_ToLowerCaseTable[256] = {\r
+ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,\r
+ 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u,\r
+ 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u,\r
+ 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u,\r
+ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,\r
+ 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u,\r
+ 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u,\r
+ 70u, 71u, 72u, 73u, 74u, 75u, 76u, 77u,\r
+ 100u, 141u, 142u, 143u, 144u, 145u, 146u, 147u,\r
+ 150u, 151u, 152u, 153u, 154u, 155u, 156u, 157u,\r
+ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,\r
+ 170u, 171u, 172u, 133u, 134u, 135u, 136u, 137u,\r
+ 140u, 141u, 142u, 143u, 144u, 145u, 146u, 147u,\r
+ 150u, 151u, 152u, 153u, 154u, 155u, 156u, 157u,\r
+ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,\r
+ 170u, 171u, 172u, 173u, 174u, 175u, 176u, 177u,\r
+ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,\r
+ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,\r
+ 220u, 221u, 222u, 223u, 224u, 225u, 226u, 227u,\r
+ 230u, 231u, 232u, 233u, 234u, 235u, 236u, 237u,\r
+ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,\r
+ 250u, 251u, 252u, 253u, 254u, 255u, 256u, 257u,\r
+ 260u, 261u, 262u, 263u, 264u, 265u, 266u, 267u,\r
+ 270u, 271u, 272u, 273u, 274u, 275u, 276u, 277u,\r
+ 340u, 341u, 342u, 343u, 344u, 345u, 346u, 347u,\r
+ 350u, 351u, 352u, 353u, 354u, 355u, 356u, 357u,\r
+ 360u, 361u, 362u, 363u, 364u, 365u, 366u, 327u,\r
+ 370u, 371u, 372u, 373u, 374u, 375u, 376u, 337u,\r
+ 340u, 341u, 342u, 343u, 344u, 345u, 346u, 347u,\r
+ 350u, 351u, 352u, 353u, 354u, 355u, 356u, 357u,\r
+ 360u, 361u, 362u, 363u, 364u, 365u, 366u, 367u,\r
+ 370u, 371u, 372u, 373u, 374u, 375u, 376u, 377u,\r
+};\r
+\r
+#ifdef USE_UPPER_CASE_TABLE\r
+const UChar OnigEncISO_8859_1_ToUpperCaseTable[256] = {\r
+ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,\r
+ 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u,\r
+ 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u,\r
+ 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u,\r
+ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,\r
+ 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u,\r
+ 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u,\r
+ 70u, 71u, 72u, 73u, 74u, 75u, 76u, 77u,\r
+ 100u, 101u, 102u, 103u, 104u, 105u, 106u, 107u,\r
+ 110u, 111u, 112u, 113u, 114u, 115u, 116u, 117u,\r
+ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,\r
+ 130u, 131u, 132u, 133u, 134u, 135u, 136u, 137u,\r
+ 140u, 101u, 102u, 103u, 104u, 105u, 106u, 107u,\r
+ 110u, 111u, 112u, 113u, 114u, 115u, 116u, 117u,\r
+ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,\r
+ 130u, 131u, 132u, 173u, 174u, 175u, 176u, 177u,\r
+ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,\r
+ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,\r
+ 220u, 221u, 222u, 223u, 224u, 225u, 226u, 227u,\r
+ 230u, 231u, 232u, 233u, 234u, 235u, 236u, 237u,\r
+ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,\r
+ 250u, 251u, 252u, 253u, 254u, 255u, 256u, 257u,\r
+ 260u, 261u, 262u, 263u, 264u, 265u, 266u, 267u,\r
+ 270u, 271u, 272u, 273u, 274u, 275u, 276u, 277u,\r
+ 300u, 301u, 302u, 303u, 304u, 305u, 306u, 307u,\r
+ 310u, 311u, 312u, 313u, 314u, 315u, 316u, 317u,\r
+ 320u, 321u, 322u, 323u, 324u, 325u, 326u, 327u,\r
+ 330u, 331u, 332u, 333u, 334u, 335u, 336u, 337u,\r
+ 300u, 301u, 302u, 303u, 304u, 305u, 306u, 307u,\r
+ 310u, 311u, 312u, 313u, 314u, 315u, 316u, 317u,\r
+ 320u, 321u, 322u, 323u, 324u, 325u, 326u, 367u,\r
+ 330u, 331u, 332u, 333u, 334u, 335u, 336u, 377u,\r
+};\r
+#endif\r
+\r
+extern void\r
+onigenc_set_default_caseconv_table(const UChar* table ARG_UNUSED)\r
+{\r
+ /* nothing */\r
+ /* obsoleted. */\r
+}\r
+\r
+extern UChar*\r
+onigenc_get_left_adjust_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\r
+{\r
+ return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\r
+}\r
+\r
+const OnigPairCaseFoldCodes OnigAsciiLowerMap[] = {\r
+ { 0x41, 0x61 },\r
+ { 0x42, 0x62 },\r
+ { 0x43, 0x63 },\r
+ { 0x44, 0x64 },\r
+ { 0x45, 0x65 },\r
+ { 0x46, 0x66 },\r
+ { 0x47, 0x67 },\r
+ { 0x48, 0x68 },\r
+ { 0x49, 0x69 },\r
+ { 0x4a, 0x6a },\r
+ { 0x4b, 0x6b },\r
+ { 0x4c, 0x6c },\r
+ { 0x4d, 0x6d },\r
+ { 0x4e, 0x6e },\r
+ { 0x4f, 0x6f },\r
+ { 0x50, 0x70 },\r
+ { 0x51, 0x71 },\r
+ { 0x52, 0x72 },\r
+ { 0x53, 0x73 },\r
+ { 0x54, 0x74 },\r
+ { 0x55, 0x75 },\r
+ { 0x56, 0x76 },\r
+ { 0x57, 0x77 },\r
+ { 0x58, 0x78 },\r
+ { 0x59, 0x79 },\r
+ { 0x5a, 0x7a }\r
+};\r
+\r
+extern int\r
+onigenc_ascii_apply_all_case_fold(OnigCaseFoldType flag ARG_UNUSED,\r
+ OnigApplyAllCaseFoldFunc f, void* arg)\r
+{\r
+ OnigCodePoint code;\r
+ int i, r;\r
+\r
+ for (i = 0;\r
+ i < (int )(sizeof(OnigAsciiLowerMap)/sizeof(OnigPairCaseFoldCodes));\r
+ i++) {\r
+ code = OnigAsciiLowerMap[i].to;\r
+ r = (*f)(OnigAsciiLowerMap[i].from, &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ code = OnigAsciiLowerMap[i].from;\r
+ r = (*f)(OnigAsciiLowerMap[i].to, &code, 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_ascii_get_case_fold_codes_by_str(OnigCaseFoldType flag ARG_UNUSED,\r
+ const OnigUChar* p, const OnigUChar* end ARG_UNUSED,\r
+ OnigCaseFoldCodeItem items[])\r
+{\r
+ if (0x41 <= *p && *p <= 0x5a) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = (OnigCodePoint )(*p + 0x20);\r
+ return 1;\r
+ }\r
+ else if (0x61 <= *p && *p <= 0x7a) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = (OnigCodePoint )(*p - 0x20);\r
+ return 1;\r
+ }\r
+ else\r
+ return 0;\r
+}\r
+\r
+static int\r
+ss_apply_all_case_fold(OnigCaseFoldType flag ARG_UNUSED,\r
+ OnigApplyAllCaseFoldFunc f, void* arg)\r
+{\r
+ static OnigCodePoint ss[] = { 0x73, 0x73 };\r
+\r
+ return (*f)((OnigCodePoint )0xdf, ss, 2, arg);\r
+}\r
+\r
+extern int\r
+onigenc_apply_all_case_fold_with_map(int map_size,\r
+ const OnigPairCaseFoldCodes map[],\r
+ int ess_tsett_flag, OnigCaseFoldType flag,\r
+ OnigApplyAllCaseFoldFunc f, void* arg)\r
+{\r
+ OnigCodePoint code;\r
+ int i, r;\r
+\r
+ r = onigenc_ascii_apply_all_case_fold(flag, f, arg);\r
+ if (r != 0) return r;\r
+\r
+ for (i = 0; i < map_size; i++) {\r
+ code = map[i].to;\r
+ r = (*f)(map[i].from, &code, 1, arg);\r
+ if (r != 0) return r;\r
+\r
+ code = map[i].from;\r
+ r = (*f)(map[i].to, &code, 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ if (ess_tsett_flag != 0)\r
+ return ss_apply_all_case_fold(flag, f, arg);\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_get_case_fold_codes_by_str_with_map(int map_size,\r
+ const OnigPairCaseFoldCodes map[],\r
+ int ess_tsett_flag, OnigCaseFoldType flag ARG_UNUSED,\r
+ const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\r
+{\r
+ if (0x41 <= *p && *p <= 0x5a) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = (OnigCodePoint )(*p + 0x20);\r
+ if (*p == 0x53 && ess_tsett_flag != 0 && end > p + 1\r
+ && (*(p+1) == 0x53 || *(p+1) == 0x73)) {\r
+ /* SS */\r
+ items[1].byte_len = 2;\r
+ items[1].code_len = 1;\r
+ items[1].code[0] = (OnigCodePoint )0xdf;\r
+ return 2;\r
+ }\r
+ else\r
+ return 1;\r
+ }\r
+ else if (0x61 <= *p && *p <= 0x7a) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = (OnigCodePoint )(*p - 0x20);\r
+ if (*p == 0x73 && ess_tsett_flag != 0 && end > p + 1\r
+ && (*(p+1) == 0x73 || *(p+1) == 0x53)) {\r
+ /* ss */\r
+ items[1].byte_len = 2;\r
+ items[1].code_len = 1;\r
+ items[1].code[0] = (OnigCodePoint )0xdf;\r
+ return 2;\r
+ }\r
+ else\r
+ return 1;\r
+ }\r
+ else if (*p == 0xdf && ess_tsett_flag != 0) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 2;\r
+ items[0].code[0] = (OnigCodePoint )'s';\r
+ items[0].code[1] = (OnigCodePoint )'s';\r
+\r
+ items[1].byte_len = 1;\r
+ items[1].code_len = 2;\r
+ items[1].code[0] = (OnigCodePoint )'S';\r
+ items[1].code[1] = (OnigCodePoint )'S';\r
+\r
+ items[2].byte_len = 1;\r
+ items[2].code_len = 2;\r
+ items[2].code[0] = (OnigCodePoint )'s';\r
+ items[2].code[1] = (OnigCodePoint )'S';\r
+\r
+ items[3].byte_len = 1;\r
+ items[3].code_len = 2;\r
+ items[3].code[0] = (OnigCodePoint )'S';\r
+ items[3].code[1] = (OnigCodePoint )'s';\r
+\r
+ return 4;\r
+ }\r
+ else {\r
+ int i;\r
+\r
+ for (i = 0; i < map_size; i++) {\r
+ if (*p == map[i].from) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = map[i].to;\r
+ return 1;\r
+ }\r
+ else if (*p == map[i].to) {\r
+ items[0].byte_len = 1;\r
+ items[0].code_len = 1;\r
+ items[0].code[0] = map[i].from;\r
+ return 1;\r
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+extern int\r
+onigenc_not_support_get_ctype_code_range(OnigCtype ctype ARG_UNUSED,\r
+ OnigCodePoint* sb_out ARG_UNUSED,\r
+ const OnigCodePoint* ranges[] ARG_UNUSED)\r
+{\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+}\r
+\r
+extern int\r
+onigenc_is_mbc_newline_0x0a(const UChar* p, const UChar* end)\r
+{\r
+ if (p < end) {\r
+ if (*p == 0x0a) return 1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+/* for single byte encodings */\r
+extern int\r
+onigenc_ascii_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED, const UChar** p,\r
+ const UChar*end ARG_UNUSED, UChar* lower)\r
+{\r
+ *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(**p);\r
+\r
+ (*p)++;\r
+ return 1; /* return byte length of converted char to lower */\r
+}\r
+\r
+#if 0\r
+extern int\r
+onigenc_ascii_is_mbc_ambiguous(OnigCaseFoldType flag,\r
+ const UChar** pp, const UChar* end)\r
+{\r
+ const UChar* p = *pp;\r
+\r
+ (*pp)++;\r
+ return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);\r
+}\r
+#endif\r
+\r
+extern int\r
+onigenc_single_byte_mbc_enc_len(const UChar* p ARG_UNUSED)\r
+{\r
+ return 1;\r
+}\r
+\r
+extern OnigCodePoint\r
+onigenc_single_byte_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\r
+{\r
+ return (OnigCodePoint )(*p);\r
+}\r
+\r
+extern int\r
+onigenc_single_byte_code_to_mbclen(OnigCodePoint code ARG_UNUSED)\r
+{\r
+ return (code < 0x100 ? 1 : ONIGERR_INVALID_CODE_POINT_VALUE);\r
+}\r
+\r
+extern int\r
+onigenc_single_byte_code_to_mbc(OnigCodePoint code, UChar *buf)\r
+{\r
+ *buf = (UChar )(code & 0xff);\r
+ return 1;\r
+}\r
+\r
+extern UChar*\r
+onigenc_single_byte_left_adjust_char_head(const UChar* start ARG_UNUSED,\r
+ const UChar* s)\r
+{\r
+ return (UChar* )s;\r
+}\r
+\r
+extern int\r
+onigenc_always_true_is_allowed_reverse_match(const UChar* s ARG_UNUSED,\r
+ const UChar* end ARG_UNUSED)\r
+{\r
+ return TRUE;\r
+}\r
+\r
+extern int\r
+onigenc_always_false_is_allowed_reverse_match(const UChar* s ARG_UNUSED,\r
+ const UChar* end ARG_UNUSED)\r
+{\r
+ return FALSE;\r
+}\r
+\r
+extern OnigCodePoint\r
+onigenc_mbn_mbc_to_code(OnigEncoding enc, const UChar* p, const UChar* end)\r
+{\r
+ int c, i, len;\r
+ OnigCodePoint n;\r
+\r
+ len = enclen(enc, p);\r
+ n = (OnigCodePoint )(*p++);\r
+ if (len == 1) return n;\r
+\r
+ for (i = 1; i < len; i++) {\r
+ if (p >= end) break;\r
+ c = *p++;\r
+ n <<= 8; n += c;\r
+ }\r
+ return n;\r
+}\r
+\r
+extern int\r
+onigenc_mbn_mbc_case_fold(OnigEncoding enc, OnigCaseFoldType flag ARG_UNUSED,\r
+ const UChar** pp, const UChar* end ARG_UNUSED,\r
+ UChar* lower)\r
+{\r
+ int len;\r
+ const UChar *p = *pp;\r
+\r
+ if (ONIGENC_IS_MBC_ASCII(p)) {\r
+ *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\r
+ (*pp)++;\r
+ return 1;\r
+ }\r
+ else {\r
+ int i;\r
+\r
+ len = enclen(enc, p);\r
+ for (i = 0; i < len; i++) {\r
+ *lower++ = *p++;\r
+ }\r
+ (*pp) += len;\r
+ return len; /* return byte length of converted to lower char */\r
+ }\r
+}\r
+\r
+#if 0\r
+extern int\r
+onigenc_mbn_is_mbc_ambiguous(OnigEncoding enc, OnigCaseFoldType flag,\r
+ const UChar** pp, const UChar* end)\r
+{\r
+ const UChar* p = *pp;\r
+\r
+ if (ONIGENC_IS_MBC_ASCII(p)) {\r
+ (*pp)++;\r
+ return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);\r
+ }\r
+\r
+ (*pp) += enclen(enc, p);\r
+ return FALSE;\r
+}\r
+#endif\r
+\r
+extern int\r
+onigenc_mb2_code_to_mbclen(OnigCodePoint code)\r
+{\r
+ if ((code & 0xff00) != 0) return 2;\r
+ else return 1;\r
+}\r
+\r
+extern int\r
+onigenc_mb4_code_to_mbclen(OnigCodePoint code)\r
+{\r
+ if ((code & 0xff000000) != 0) return 4;\r
+ else if ((code & 0xff0000) != 0) return 3;\r
+ else if ((code & 0xff00) != 0) return 2;\r
+ else return 1;\r
+}\r
+\r
+extern int\r
+onigenc_mb2_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)\r
+{\r
+ UChar *p = buf;\r
+\r
+ if ((code & 0xff00) != 0) {\r
+ *p++ = (UChar )((code >> 8) & 0xff);\r
+ }\r
+ *p++ = (UChar )(code & 0xff);\r
+\r
+#if 1\r
+ if (enclen(enc, buf) != (p - buf))\r
+ return ONIGERR_INVALID_CODE_POINT_VALUE;\r
+#endif\r
+ return (int)(p - buf);\r
+}\r
+\r
+extern int\r
+onigenc_mb4_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)\r
+{\r
+ UChar *p = buf;\r
+\r
+ if ((code & 0xff000000) != 0) {\r
+ *p++ = (UChar )((code >> 24) & 0xff);\r
+ }\r
+ if ((code & 0xff0000) != 0 || p != buf) {\r
+ *p++ = (UChar )((code >> 16) & 0xff);\r
+ }\r
+ if ((code & 0xff00) != 0 || p != buf) {\r
+ *p++ = (UChar )((code >> 8) & 0xff);\r
+ }\r
+ *p++ = (UChar )(code & 0xff);\r
+\r
+#if 1\r
+ if (enclen(enc, buf) != (p - buf))\r
+ return ONIGERR_INVALID_CODE_POINT_VALUE;\r
+#endif\r
+ return (int)(p - buf);\r
+}\r
+\r
+extern int\r
+onigenc_minimum_property_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)\r
+{\r
+ static PosixBracketEntryType PBS[] = {\r
+ { (UChar* )"Alnum", ONIGENC_CTYPE_ALNUM, 5 },\r
+ { (UChar* )"Alpha", ONIGENC_CTYPE_ALPHA, 5 },\r
+ { (UChar* )"Blank", ONIGENC_CTYPE_BLANK, 5 },\r
+ { (UChar* )"Cntrl", ONIGENC_CTYPE_CNTRL, 5 },\r
+ { (UChar* )"Digit", ONIGENC_CTYPE_DIGIT, 5 },\r
+ { (UChar* )"Graph", ONIGENC_CTYPE_GRAPH, 5 },\r
+ { (UChar* )"Lower", ONIGENC_CTYPE_LOWER, 5 },\r
+ { (UChar* )"Print", ONIGENC_CTYPE_PRINT, 5 },\r
+ { (UChar* )"Punct", ONIGENC_CTYPE_PUNCT, 5 },\r
+ { (UChar* )"Space", ONIGENC_CTYPE_SPACE, 5 },\r
+ { (UChar* )"Upper", ONIGENC_CTYPE_UPPER, 5 },\r
+ { (UChar* )"XDigit", ONIGENC_CTYPE_XDIGIT, 6 },\r
+ { (UChar* )"ASCII", ONIGENC_CTYPE_ASCII, 5 },\r
+ { (UChar* )"Word", ONIGENC_CTYPE_WORD, 4 },\r
+ { (UChar* )NULL, -1, 0 }\r
+ };\r
+\r
+ PosixBracketEntryType *pb;\r
+ int len;\r
+\r
+ len = onigenc_strlen(enc, p, end);\r
+ for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {\r
+ if (len == pb->len &&\r
+ onigenc_with_ascii_strncmp(enc, p, end, pb->name, pb->len) == 0)\r
+ return pb->ctype;\r
+ }\r
+\r
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\r
+}\r
+\r
+extern int\r
+onigenc_mb2_is_code_ctype(OnigEncoding enc, OnigCodePoint code,\r
+ unsigned int ctype)\r
+{\r
+ if (code < 128)\r
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\r
+ else {\r
+ if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\r
+ return (ONIGENC_CODE_TO_MBCLEN(enc, code) > 1 ? TRUE : FALSE);\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+extern int\r
+onigenc_mb4_is_code_ctype(OnigEncoding enc, OnigCodePoint code,\r
+ unsigned int ctype)\r
+{\r
+ if (code < 128)\r
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\r
+ else {\r
+ if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\r
+ return (ONIGENC_CODE_TO_MBCLEN(enc, code) > 1 ? TRUE : FALSE);\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+extern int\r
+onigenc_with_ascii_strncmp(OnigEncoding enc, const UChar* p, const UChar* end,\r
+ const UChar* sascii /* ascii */, int n)\r
+{\r
+ int x, c;\r
+\r
+ while (n-- > 0) {\r
+ if (p >= end) return (int )(*sascii);\r
+\r
+ c = (int )ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ x = *sascii - c;\r
+ if (x) return x;\r
+\r
+ sascii++;\r
+ p += enclen(enc, p);\r
+ }\r
+ return 0;\r
+}\r
+\r
+/* Property management */\r
+static int\r
+resize_property_list(int new_size, const OnigCodePoint*** plist, int* psize)\r
+{\r
+ int size;\r
+ const OnigCodePoint **list = *plist;\r
+\r
+ size = sizeof(OnigCodePoint*) * new_size;\r
+ if (IS_NULL(list)) {\r
+ list = (const OnigCodePoint** )xmalloc(size);\r
+ }\r
+ else {\r
+ list = (const OnigCodePoint** )xrealloc((void* )list, size, *psize * sizeof(OnigCodePoint*));\r
+ }\r
+\r
+ if (IS_NULL(list)) return ONIGERR_MEMORY;\r
+\r
+ *plist = list;\r
+ *psize = new_size;\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_property_list_add_property(UChar* name, const OnigCodePoint* prop,\r
+ hash_table_type **table, const OnigCodePoint*** plist, int *pnum,\r
+ int *psize)\r
+{\r
+#define PROP_INIT_SIZE 16\r
+\r
+ int r;\r
+\r
+ if (*psize <= *pnum) {\r
+ int new_size = (*psize == 0 ? PROP_INIT_SIZE : *psize * 2);\r
+ r = resize_property_list(new_size, plist, psize);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ (*plist)[*pnum] = prop;\r
+\r
+ if (ONIG_IS_NULL(*table)) {\r
+ *table = onig_st_init_strend_table_with_size(PROP_INIT_SIZE);\r
+ if (ONIG_IS_NULL(*table)) return ONIGERR_MEMORY;\r
+ }\r
+\r
+ *pnum = *pnum + 1;\r
+ onig_st_insert_strend(*table, name, name + strlen_s((char* )name, MAX_STRING_SIZE),\r
+ (hash_data_type )(*pnum + ONIGENC_MAX_STD_CTYPE));\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onigenc_property_list_init(int (*f)(void))\r
+{\r
+ int r;\r
+\r
+ THREAD_ATOMIC_START;\r
+\r
+ r = f();\r
+\r
+ THREAD_ATOMIC_END;\r
+ return r;\r
+}\r
--- /dev/null
+#ifndef REGENC_H\r
+#define REGENC_H\r
+/**********************************************************************\r
+ regenc.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef PACKAGE\r
+/* PACKAGE is defined in config.h */\r
+//#include "config.h"\r
+#endif\r
+\r
+#ifdef ONIG_ESCAPE_UCHAR_COLLISION\r
+#undef ONIG_ESCAPE_UCHAR_COLLISION\r
+#endif\r
+\r
+#include "oniguruma.h"\r
+\r
+typedef struct {\r
+ OnigCodePoint from;\r
+ OnigCodePoint to;\r
+} OnigPairCaseFoldCodes;\r
+\r
+\r
+#ifndef NULL\r
+#define NULL ((void* )0)\r
+#endif\r
+\r
+#ifndef TRUE\r
+#define TRUE 1\r
+#endif\r
+\r
+#ifndef FALSE\r
+#define FALSE 0\r
+#endif\r
+\r
+#ifndef ARG_UNUSED\r
+#if defined(__GNUC__)\r
+# define ARG_UNUSED __attribute__ ((unused))\r
+#else\r
+# define ARG_UNUSED\r
+#endif\r
+#endif\r
+\r
+#define ONIG_IS_NULL(p) (((void*)(p)) == (void*)0)\r
+#define ONIG_IS_NOT_NULL(p) (((void*)(p)) != (void*)0)\r
+#define ONIG_CHECK_NULL_RETURN(p) if (ONIG_IS_NULL(p)) return NULL\r
+#define ONIG_CHECK_NULL_RETURN_VAL(p,val) if (ONIG_IS_NULL(p)) return (val)\r
+\r
+#define enclen(enc,p) ONIGENC_MBC_ENC_LEN(enc,p)\r
+\r
+/* character types bit flag */\r
+#define BIT_CTYPE_NEWLINE (1<< ONIGENC_CTYPE_NEWLINE)\r
+#define BIT_CTYPE_ALPHA (1<< ONIGENC_CTYPE_ALPHA)\r
+#define BIT_CTYPE_BLANK (1<< ONIGENC_CTYPE_BLANK)\r
+#define BIT_CTYPE_CNTRL (1<< ONIGENC_CTYPE_CNTRL)\r
+#define BIT_CTYPE_DIGIT (1<< ONIGENC_CTYPE_DIGIT)\r
+#define BIT_CTYPE_GRAPH (1<< ONIGENC_CTYPE_GRAPH)\r
+#define BIT_CTYPE_LOWER (1<< ONIGENC_CTYPE_LOWER)\r
+#define BIT_CTYPE_PRINT (1<< ONIGENC_CTYPE_PRINT)\r
+#define BIT_CTYPE_PUNCT (1<< ONIGENC_CTYPE_PUNCT)\r
+#define BIT_CTYPE_SPACE (1<< ONIGENC_CTYPE_SPACE)\r
+#define BIT_CTYPE_UPPER (1<< ONIGENC_CTYPE_UPPER)\r
+#define BIT_CTYPE_XDIGIT (1<< ONIGENC_CTYPE_XDIGIT)\r
+#define BIT_CTYPE_WORD (1<< ONIGENC_CTYPE_WORD)\r
+#define BIT_CTYPE_ALNUM (1<< ONIGENC_CTYPE_ALNUM)\r
+#define BIT_CTYPE_ASCII (1<< ONIGENC_CTYPE_ASCII)\r
+\r
+#define CTYPE_TO_BIT(ctype) (1<<(ctype))\r
+#define CTYPE_IS_WORD_GRAPH_PRINT(ctype) \\r
+ ((ctype) == ONIGENC_CTYPE_WORD || (ctype) == ONIGENC_CTYPE_GRAPH ||\\r
+ (ctype) == ONIGENC_CTYPE_PRINT)\r
+\r
+\r
+typedef struct {\r
+ UChar *name;\r
+ int ctype;\r
+ short int len;\r
+} PosixBracketEntryType;\r
+\r
+\r
+/* #define USE_CRNL_AS_LINE_TERMINATOR */\r
+#define USE_UNICODE_PROPERTIES\r
+/* #define USE_UNICODE_CASE_FOLD_TURKISH_AZERI */\r
+/* #define USE_UNICODE_ALL_LINE_TERMINATORS */ /* see Unicode.org UTF#18 */\r
+\r
+\r
+#define ONIG_ENCODING_INIT_DEFAULT ONIG_ENCODING_ASCII\r
+\r
+/* for encoding system implementation (internal) */\r
+ONIG_EXTERN int onigenc_ascii_apply_all_case_fold P_((OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\r
+ONIG_EXTERN int onigenc_ascii_get_case_fold_codes_by_str P_((OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\r
+ONIG_EXTERN int onigenc_apply_all_case_fold_with_map P_((int map_size, const OnigPairCaseFoldCodes map[], int ess_tsett_flag, OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\r
+ONIG_EXTERN int onigenc_get_case_fold_codes_by_str_with_map P_((int map_size, const OnigPairCaseFoldCodes map[], int ess_tsett_flag, OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\r
+ONIG_EXTERN int onigenc_not_support_get_ctype_code_range P_((OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]));\r
+ONIG_EXTERN int onigenc_is_mbc_newline_0x0a P_((const UChar* p, const UChar* end));\r
+\r
+\r
+/* methods for single byte encoding */\r
+ONIG_EXTERN int onigenc_ascii_mbc_case_fold P_((OnigCaseFoldType flag, const UChar** p, const UChar* end, UChar* lower));\r
+ONIG_EXTERN int onigenc_single_byte_mbc_enc_len P_((const UChar* p));\r
+ONIG_EXTERN OnigCodePoint onigenc_single_byte_mbc_to_code P_((const UChar* p, const UChar* end));\r
+ONIG_EXTERN int onigenc_single_byte_code_to_mbclen P_((OnigCodePoint code));\r
+ONIG_EXTERN int onigenc_single_byte_code_to_mbc P_((OnigCodePoint code, UChar *buf));\r
+ONIG_EXTERN UChar* onigenc_single_byte_left_adjust_char_head P_((const UChar* start, const UChar* s));\r
+ONIG_EXTERN int onigenc_always_true_is_allowed_reverse_match P_((const UChar* s, const UChar* end));\r
+ONIG_EXTERN int onigenc_always_false_is_allowed_reverse_match P_((const UChar* s, const UChar* end));\r
+\r
+/* methods for multi byte encoding */\r
+ONIG_EXTERN OnigCodePoint onigenc_mbn_mbc_to_code P_((OnigEncoding enc, const UChar* p, const UChar* end));\r
+ONIG_EXTERN int onigenc_mbn_mbc_case_fold P_((OnigEncoding enc, OnigCaseFoldType flag, const UChar** p, const UChar* end, UChar* lower));\r
+ONIG_EXTERN int onigenc_mb2_code_to_mbclen P_((OnigCodePoint code));\r
+ONIG_EXTERN int onigenc_mb2_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));\r
+ONIG_EXTERN int onigenc_minimum_property_name_to_ctype P_((OnigEncoding enc, UChar* p, UChar* end));\r
+ONIG_EXTERN int onigenc_unicode_property_name_to_ctype P_((OnigEncoding enc, UChar* p, UChar* end));\r
+ONIG_EXTERN int onigenc_mb2_is_code_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));\r
+ONIG_EXTERN int onigenc_mb4_code_to_mbclen P_((OnigCodePoint code));\r
+ONIG_EXTERN int onigenc_mb4_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));\r
+ONIG_EXTERN int onigenc_mb4_is_code_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));\r
+\r
+\r
+/* in enc/unicode.c */\r
+ONIG_EXTERN int onigenc_unicode_is_code_ctype P_((OnigCodePoint code, unsigned int ctype));\r
+ONIG_EXTERN int onigenc_utf16_32_get_ctype_code_range P_((OnigCtype ctype, OnigCodePoint *sb_out, const OnigCodePoint* ranges[]));\r
+ONIG_EXTERN int onigenc_unicode_ctype_code_range P_((int ctype, const OnigCodePoint* ranges[]));\r
+ONIG_EXTERN int onigenc_unicode_get_case_fold_codes_by_str P_((OnigEncoding enc, OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\r
+ONIG_EXTERN int onigenc_unicode_mbc_case_fold P_((OnigEncoding enc, OnigCaseFoldType flag, const UChar** pp, const UChar* end, UChar* fold));\r
+ONIG_EXTERN int onigenc_unicode_apply_all_case_fold P_((OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\r
+\r
+\r
+#define UTF16_IS_SURROGATE_FIRST(c) (((c) & 0xfc) == 0xd8)\r
+#define UTF16_IS_SURROGATE_SECOND(c) (((c) & 0xfc) == 0xdc)\r
+\r
+#define ONIGENC_ISO_8859_1_TO_LOWER_CASE(c) \\r
+ OnigEncISO_8859_1_ToLowerCaseTable[c]\r
+#define ONIGENC_ISO_8859_1_TO_UPPER_CASE(c) \\r
+ OnigEncISO_8859_1_ToUpperCaseTable[c]\r
+\r
+ONIG_EXTERN const UChar OnigEncISO_8859_1_ToLowerCaseTable[];\r
+ONIG_EXTERN const UChar OnigEncISO_8859_1_ToUpperCaseTable[];\r
+\r
+ONIG_EXTERN int\r
+onigenc_with_ascii_strncmp P_((OnigEncoding enc, const UChar* p, const UChar* end, const UChar* sascii /* ascii */, int n));\r
+ONIG_EXTERN UChar*\r
+onigenc_step P_((OnigEncoding enc, const UChar* p, const UChar* end, int n));\r
+\r
+/* defined in regexec.c, but used in enc/xxx.c */\r
+extern int onig_is_in_code_range P_((const UChar* p, OnigCodePoint code));\r
+\r
+ONIG_EXTERN OnigEncoding OnigEncDefaultCharEncoding;\r
+ONIG_EXTERN const UChar OnigEncAsciiToLowerCaseTable[];\r
+ONIG_EXTERN const UChar OnigEncAsciiToUpperCaseTable[];\r
+ONIG_EXTERN const unsigned short OnigEncAsciiCtypeTable[];\r
+\r
+#define ONIGENC_IS_ASCII_CODE(code) ((code) < 0x80)\r
+#define ONIGENC_ASCII_CODE_TO_LOWER_CASE(c) OnigEncAsciiToLowerCaseTable[c]\r
+#define ONIGENC_ASCII_CODE_TO_UPPER_CASE(c) OnigEncAsciiToUpperCaseTable[c]\r
+#define ONIGENC_IS_ASCII_CODE_CTYPE(code,ctype) \\r
+ ((OnigEncAsciiCtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\r
+#define ONIGENC_IS_ASCII_CODE_CASE_AMBIG(code) \\r
+ (ONIGENC_IS_ASCII_CODE_CTYPE(code, ONIGENC_CTYPE_UPPER) ||\\r
+ ONIGENC_IS_ASCII_CODE_CTYPE(code, ONIGENC_CTYPE_LOWER))\r
+ \r
+\r
+#endif /* REGENC_H */\r
--- /dev/null
+/**********************************************************************\r
+ regerror.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#define HAVE_STDARG_PROTOTYPES\r
+\r
+#include "regint.h"\r
+\r
+#if 0\r
+#include <stdio.h> /* for vsnprintf() */\r
+\r
+#ifdef HAVE_STDARG_PROTOTYPES\r
+#include <stdarg.h>\r
+#define va_init_list(a,b) va_start(a,b)\r
+#else\r
+#include <varargs.h>\r
+#define va_init_list(a,b) va_start(a)\r
+#endif\r
+#endif\r
+\r
+extern UChar*\r
+onig_error_code_to_format(int code)\r
+{\r
+ char *p;\r
+\r
+ if (code >= 0) return (UChar* )0;\r
+\r
+ switch (code) {\r
+ case ONIG_MISMATCH:\r
+ p = "mismatch"; break;\r
+ case ONIG_NO_SUPPORT_CONFIG:\r
+ p = "no support in this configuration"; break;\r
+ case ONIGERR_MEMORY:\r
+ p = "fail to memory allocation"; break;\r
+ case ONIGERR_MATCH_STACK_LIMIT_OVER:\r
+ p = "match-stack limit over"; break;\r
+ case ONIGERR_TYPE_BUG:\r
+ p = "undefined type (bug)"; break;\r
+ case ONIGERR_PARSER_BUG:\r
+ p = "internal parser error (bug)"; break;\r
+ case ONIGERR_STACK_BUG:\r
+ p = "stack error (bug)"; break;\r
+ case ONIGERR_UNDEFINED_BYTECODE:\r
+ p = "undefined bytecode (bug)"; break;\r
+ case ONIGERR_UNEXPECTED_BYTECODE:\r
+ p = "unexpected bytecode (bug)"; break;\r
+ case ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED:\r
+ p = "default multibyte-encoding is not setted"; break;\r
+ case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:\r
+ p = "can't convert to wide-char on specified multibyte-encoding"; break;\r
+ case ONIGERR_INVALID_ARGUMENT:\r
+ p = "invalid argument"; break;\r
+ case ONIGERR_END_PATTERN_AT_LEFT_BRACE:\r
+ p = "end pattern at left brace"; break;\r
+ case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:\r
+ p = "end pattern at left bracket"; break;\r
+ case ONIGERR_EMPTY_CHAR_CLASS:\r
+ p = "empty char-class"; break;\r
+ case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:\r
+ p = "premature end of char-class"; break;\r
+ case ONIGERR_END_PATTERN_AT_ESCAPE:\r
+ p = "end pattern at escape"; break;\r
+ case ONIGERR_END_PATTERN_AT_META:\r
+ p = "end pattern at meta"; break;\r
+ case ONIGERR_END_PATTERN_AT_CONTROL:\r
+ p = "end pattern at control"; break;\r
+ case ONIGERR_META_CODE_SYNTAX:\r
+ p = "invalid meta-code syntax"; break;\r
+ case ONIGERR_CONTROL_CODE_SYNTAX:\r
+ p = "invalid control-code syntax"; break;\r
+ case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:\r
+ p = "char-class value at end of range"; break;\r
+ case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:\r
+ p = "char-class value at start of range"; break;\r
+ case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:\r
+ p = "unmatched range specifier in char-class"; break;\r
+ case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:\r
+ p = "target of repeat operator is not specified"; break;\r
+ case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:\r
+ p = "target of repeat operator is invalid"; break;\r
+ case ONIGERR_NESTED_REPEAT_OPERATOR:\r
+ p = "nested repeat operator"; break;\r
+ case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:\r
+ p = "unmatched close parenthesis"; break;\r
+ case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:\r
+ p = "end pattern with unmatched parenthesis"; break;\r
+ case ONIGERR_END_PATTERN_IN_GROUP:\r
+ p = "end pattern in group"; break;\r
+ case ONIGERR_UNDEFINED_GROUP_OPTION:\r
+ p = "undefined group option"; break;\r
+ case ONIGERR_INVALID_POSIX_BRACKET_TYPE:\r
+ p = "invalid POSIX bracket type"; break;\r
+ case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:\r
+ p = "invalid pattern in look-behind"; break;\r
+ case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:\r
+ p = "invalid repeat range {lower,upper}"; break;\r
+ case ONIGERR_TOO_BIG_NUMBER:\r
+ p = "too big number"; break;\r
+ case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:\r
+ p = "too big number for repeat range"; break;\r
+ case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:\r
+ p = "upper is smaller than lower in repeat range"; break;\r
+ case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:\r
+ p = "empty range in char class"; break;\r
+ case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:\r
+ p = "mismatch multibyte code length in char-class range"; break;\r
+ case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:\r
+ p = "too many multibyte code ranges are specified"; break;\r
+ case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:\r
+ p = "too short multibyte code string"; break;\r
+ case ONIGERR_TOO_BIG_BACKREF_NUMBER:\r
+ p = "too big backref number"; break;\r
+ case ONIGERR_INVALID_BACKREF:\r
+#ifdef USE_NAMED_GROUP\r
+ p = "invalid backref number/name"; break;\r
+#else\r
+ p = "invalid backref number"; break;\r
+#endif\r
+ case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:\r
+ p = "numbered backref/call is not allowed. (use name)"; break;\r
+ case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:\r
+ p = "too big wide-char value"; break;\r
+ case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:\r
+ p = "too long wide-char value"; break;\r
+ case ONIGERR_INVALID_CODE_POINT_VALUE:\r
+ p = "invalid code point value"; break;\r
+ case ONIGERR_EMPTY_GROUP_NAME:\r
+ p = "group name is empty"; break;\r
+ case ONIGERR_INVALID_GROUP_NAME:\r
+ p = "invalid group name <%n>"; break;\r
+ case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
+#ifdef USE_NAMED_GROUP\r
+ p = "invalid char in group name <%n>"; break;\r
+#else\r
+ p = "invalid char in group number <%n>"; break;\r
+#endif\r
+ case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
+ p = "undefined name <%n> reference"; break;\r
+ case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
+ p = "undefined group <%n> reference"; break;\r
+ case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
+ p = "multiplex defined name <%n>"; break;\r
+ case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
+ p = "multiplex definition name <%n> call"; break;\r
+ case ONIGERR_NEVER_ENDING_RECURSION:\r
+ p = "never ending recursion"; break;\r
+ case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:\r
+ p = "group number is too big for capture history"; break;\r
+ case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
+ p = "invalid character property name {%n}"; break;\r
+ case ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION:\r
+ p = "not supported encoding combination"; break;\r
+ case ONIGERR_INVALID_COMBINATION_OF_OPTIONS:\r
+ p = "invalid combination of options"; break;\r
+ case ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT:\r
+ p = "over thread pass limit count"; break;\r
+\r
+ default:\r
+ p = "undefined error code"; break;\r
+ }\r
+\r
+ return (UChar* )p;\r
+}\r
+\r
+static void sprint_byte(char* s, unsigned int v)\r
+{\r
+ sprintf(s, "%02x", (v & 0377));\r
+}\r
+\r
+static void sprint_byte_with_x(char* s, unsigned int v)\r
+{\r
+ sprintf(s, "\\x%02x", (v & 0377));\r
+}\r
+\r
+static int to_ascii(OnigEncoding enc, UChar *s, UChar *end,\r
+ UChar buf[], int buf_size, int *is_over)\r
+{\r
+ int len;\r
+ UChar *p;\r
+ OnigCodePoint code;\r
+\r
+ if (ONIGENC_MBC_MINLEN(enc) > 1) {\r
+ p = s;\r
+ len = 0;\r
+ while (p < end) {\r
+ code = ONIGENC_MBC_TO_CODE(enc, p, end);\r
+ if (code >= 0x80) {\r
+ if (code > 0xffff && len + 10 <= buf_size) {\r
+ sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 24));\r
+ sprint_byte((char*)(&(buf[len+4])), (unsigned int)(code >> 16));\r
+ sprint_byte((char*)(&(buf[len+6])), (unsigned int)(code >> 8));\r
+ sprint_byte((char*)(&(buf[len+8])), (unsigned int)code);\r
+ len += 10;\r
+ }\r
+ else if (len + 6 <= buf_size) {\r
+ sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 8));\r
+ sprint_byte((char*)(&(buf[len+4])), (unsigned int)code);\r
+ len += 6;\r
+ }\r
+ else {\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ buf[len++] = (UChar )code;\r
+ }\r
+\r
+ p += enclen(enc, p);\r
+ if (len >= buf_size) break;\r
+ }\r
+\r
+ *is_over = ((p < end) ? 1 : 0);\r
+ }\r
+ else {\r
+ len = MIN((int)(end - s), buf_size);\r
+ xmemcpy(buf, s, (size_t )len);\r
+ *is_over = ((buf_size < (end - s)) ? 1 : 0);\r
+ }\r
+\r
+ return len;\r
+}\r
+\r
+\r
+/* for ONIG_MAX_ERROR_MESSAGE_LEN */\r
+#define MAX_ERROR_PAR_LEN 30\r
+\r
+extern int\r
+#ifdef HAVE_STDARG_PROTOTYPES\r
+onig_error_code_to_str(UChar* s, int code, ...)\r
+#else\r
+onig_error_code_to_str(s, code, va_alist)\r
+ UChar* s;\r
+ int code;\r
+ va_dcl \r
+#endif\r
+{\r
+ UChar *p, *q;\r
+ OnigErrorInfo* einfo;\r
+ int len, is_over;\r
+ UChar parbuf[MAX_ERROR_PAR_LEN];\r
+ va_list vargs;\r
+\r
+ va_init_list(vargs, code);\r
+\r
+ switch (code) {\r
+ case ONIGERR_UNDEFINED_NAME_REFERENCE:\r
+ case ONIGERR_UNDEFINED_GROUP_REFERENCE:\r
+ case ONIGERR_MULTIPLEX_DEFINED_NAME:\r
+ case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\r
+ case ONIGERR_INVALID_GROUP_NAME:\r
+ case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\r
+ case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\r
+ einfo = va_arg(vargs, OnigErrorInfo*);\r
+ len = to_ascii(einfo->enc, einfo->par, einfo->par_end,\r
+ parbuf, MAX_ERROR_PAR_LEN - 3, &is_over);\r
+ q = onig_error_code_to_format(code);\r
+ p = s;\r
+ while (*q != '\0') {\r
+ if (*q == '%') {\r
+ q++;\r
+ if (*q == 'n') { /* '%n': name */\r
+ xmemcpy(p, parbuf, len);\r
+ p += len;\r
+ if (is_over != 0) {\r
+ xmemcpy(p, "...", 3);\r
+ p += 3;\r
+ }\r
+ q++;\r
+ }\r
+ else\r
+ goto normal_char;\r
+ }\r
+ else {\r
+ normal_char:\r
+ *p++ = *q++;\r
+ }\r
+ }\r
+ *p = '\0';\r
+ len = (int)(p - s);\r
+ break;\r
+\r
+ default:\r
+ q = onig_error_code_to_format(code);\r
+ len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, q);\r
+ xmemcpy(s, q, len);\r
+ s[len] = '\0';\r
+ break;\r
+ }\r
+\r
+ va_end(vargs);\r
+ return len;\r
+}\r
+\r
+\r
+void\r
+#ifdef HAVE_STDARG_PROTOTYPES\r
+onig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc,\r
+ UChar* pat, UChar* pat_end, const UChar *fmt, ...)\r
+#else\r
+onig_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)\r
+ UChar buf[];\r
+ int bufsize;\r
+ OnigEncoding enc;\r
+ UChar* pat;\r
+ UChar* pat_end;\r
+ const UChar *fmt;\r
+ va_dcl\r
+#endif\r
+{\r
+ int n, need, len;\r
+ UChar *p, *s, *bp;\r
+ UChar bs[6];\r
+ va_list args;\r
+\r
+ va_init_list(args, fmt);\r
+ n = xvsnprintf((char* )buf, bufsize, (const char* )fmt, args);\r
+ va_end(args);\r
+\r
+ need = (int)(pat_end - pat) * 4 + 4;\r
+\r
+ if (n + need < bufsize) {\r
+ strcat_s((char* )buf, bufsize, ": /");\r
+ s = buf + onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, buf);\r
+\r
+ p = pat;\r
+ while (p < pat_end) {\r
+ if (*p == '\\') {\r
+ *s++ = *p++;\r
+ len = enclen(enc, p);\r
+ while (len-- > 0) *s++ = *p++;\r
+ }\r
+ else if (*p == '/') {\r
+ *s++ = (unsigned char )'\\';\r
+ *s++ = *p++;\r
+ }\r
+ else if (ONIGENC_IS_MBC_HEAD(enc, p)) {\r
+ len = enclen(enc, p);\r
+ if (ONIGENC_MBC_MINLEN(enc) == 1) {\r
+ while (len-- > 0) *s++ = *p++;\r
+ }\r
+ else { /* for UTF16 */\r
+ int blen;\r
+\r
+ while (len-- > 0) {\r
+ sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
+ blen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
+ bp = bs;\r
+ while (blen-- > 0) *s++ = *bp++;\r
+ }\r
+ }\r
+ }\r
+ else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&\r
+ !ONIGENC_IS_CODE_SPACE(enc, *p)) {\r
+ sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\r
+ len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\r
+ bp = bs;\r
+ while (len-- > 0) *s++ = *bp++;\r
+ }\r
+ else {\r
+ *s++ = *p++;\r
+ }\r
+ }\r
+\r
+ *s++ = '/';\r
+ *s = '\0';\r
+ }\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ regexec.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+#define USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+#define ONIGENC_IS_MBC_CRNL(enc,p,end) \\r
+ (ONIGENC_MBC_TO_CODE(enc,p,end) == 13 && \\r
+ ONIGENC_IS_MBC_NEWLINE(enc,(p+enclen(enc,p)),end))\r
+#endif\r
+\r
+#ifdef USE_CAPTURE_HISTORY\r
+static void history_tree_free(OnigCaptureTreeNode* node);\r
+\r
+static void\r
+history_tree_clear(OnigCaptureTreeNode* node)\r
+{\r
+ int i;\r
+\r
+ if (IS_NOT_NULL(node)) {\r
+ for (i = 0; i < node->num_childs; i++) {\r
+ if (IS_NOT_NULL(node->childs[i])) {\r
+ history_tree_free(node->childs[i]);\r
+ }\r
+ }\r
+ for (i = 0; i < node->allocated; i++) {\r
+ node->childs[i] = (OnigCaptureTreeNode* )0;\r
+ }\r
+ node->num_childs = 0;\r
+ node->beg = ONIG_REGION_NOTPOS;\r
+ node->end = ONIG_REGION_NOTPOS;\r
+ node->group = -1;\r
+ }\r
+}\r
+\r
+static void\r
+history_tree_free(OnigCaptureTreeNode* node)\r
+{\r
+ history_tree_clear(node);\r
+ xfree(node);\r
+}\r
+\r
+static void\r
+history_root_free(OnigRegion* r)\r
+{\r
+ if (IS_NOT_NULL(r->history_root)) {\r
+ history_tree_free(r->history_root);\r
+ r->history_root = (OnigCaptureTreeNode* )0;\r
+ }\r
+}\r
+\r
+static OnigCaptureTreeNode*\r
+history_node_new(void)\r
+{\r
+ OnigCaptureTreeNode* node;\r
+\r
+ node = (OnigCaptureTreeNode* )xmalloc(sizeof(OnigCaptureTreeNode));\r
+ CHECK_NULL_RETURN(node);\r
+ node->childs = (OnigCaptureTreeNode** )0;\r
+ node->allocated = 0;\r
+ node->num_childs = 0;\r
+ node->group = -1;\r
+ node->beg = ONIG_REGION_NOTPOS;\r
+ node->end = ONIG_REGION_NOTPOS;\r
+\r
+ return node;\r
+}\r
+\r
+static int\r
+history_tree_add_child(OnigCaptureTreeNode* parent, OnigCaptureTreeNode* child)\r
+{\r
+#define HISTORY_TREE_INIT_ALLOC_SIZE 8\r
+\r
+ if (parent->num_childs >= parent->allocated) {\r
+ int n, i;\r
+\r
+ if (IS_NULL(parent->childs)) {\r
+ n = HISTORY_TREE_INIT_ALLOC_SIZE;\r
+ parent->childs =\r
+ (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n);\r
+ }\r
+ else {\r
+ n = parent->allocated * 2;\r
+ parent->childs =\r
+ (OnigCaptureTreeNode** )xrealloc(parent->childs,\r
+ sizeof(OnigCaptureTreeNode*) * n,\r
+ sizeof(OnigCaptureTreeNode*) * parent->allocated);\r
+ }\r
+ CHECK_NULL_RETURN_MEMERR(parent->childs);\r
+ for (i = parent->allocated; i < n; i++) {\r
+ parent->childs[i] = (OnigCaptureTreeNode* )0;\r
+ }\r
+ parent->allocated = n;\r
+ }\r
+\r
+ parent->childs[parent->num_childs] = child;\r
+ parent->num_childs++;\r
+ return 0;\r
+}\r
+\r
+static OnigCaptureTreeNode*\r
+history_tree_clone(OnigCaptureTreeNode* node)\r
+{\r
+ int i;\r
+ OnigCaptureTreeNode *clone, *child;\r
+\r
+ clone = history_node_new();\r
+ CHECK_NULL_RETURN(clone);\r
+\r
+ clone->beg = node->beg;\r
+ clone->end = node->end;\r
+ for (i = 0; i < node->num_childs; i++) {\r
+ child = history_tree_clone(node->childs[i]);\r
+ if (IS_NULL(child)) {\r
+ history_tree_free(clone);\r
+ return (OnigCaptureTreeNode* )0;\r
+ }\r
+ history_tree_add_child(clone, child);\r
+ }\r
+\r
+ return clone;\r
+}\r
+\r
+extern OnigCaptureTreeNode*\r
+onig_get_capture_tree(OnigRegion* region)\r
+{\r
+ return region->history_root;\r
+}\r
+#endif /* USE_CAPTURE_HISTORY */\r
+\r
+extern void\r
+onig_region_clear(OnigRegion* region)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; i < region->num_regs; i++) {\r
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;\r
+ }\r
+#ifdef USE_CAPTURE_HISTORY\r
+ history_root_free(region);\r
+#endif\r
+}\r
+\r
+extern int\r
+onig_region_resize(OnigRegion* region, int n)\r
+{\r
+ region->num_regs = n;\r
+\r
+ if (n < ONIG_NREGION)\r
+ n = ONIG_NREGION;\r
+\r
+ if (region->allocated == 0) {\r
+ region->beg = (int* )xmalloc(n * sizeof(int));\r
+ region->end = (int* )xmalloc(n * sizeof(int));\r
+\r
+ if (region->beg == 0 || region->end == 0)\r
+ return ONIGERR_MEMORY;\r
+\r
+ region->allocated = n;\r
+ }\r
+ else if (region->allocated < n) {\r
+ region->beg = (int* )xrealloc(region->beg, n * sizeof(int), region->allocated * sizeof(int));\r
+ region->end = (int* )xrealloc(region->end, n * sizeof(int), region->allocated * sizeof(int));\r
+\r
+ if (region->beg == 0 || region->end == 0)\r
+ return ONIGERR_MEMORY;\r
+\r
+ region->allocated = n;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+onig_region_resize_clear(OnigRegion* region, int n)\r
+{\r
+ int r;\r
+ \r
+ r = onig_region_resize(region, n);\r
+ if (r != 0) return r;\r
+ onig_region_clear(region);\r
+ return 0;\r
+}\r
+ \r
+extern int\r
+onig_region_set(OnigRegion* region, int at, int beg, int end)\r
+{\r
+ if (at < 0) return ONIGERR_INVALID_ARGUMENT;\r
+\r
+ if (at >= region->allocated) {\r
+ int r = onig_region_resize(region, at + 1);\r
+ if (r < 0) return r;\r
+ }\r
+ \r
+ region->beg[at] = beg;\r
+ region->end[at] = end;\r
+ return 0;\r
+}\r
+\r
+extern void\r
+onig_region_init(OnigRegion* region)\r
+{\r
+ region->num_regs = 0;\r
+ region->allocated = 0;\r
+ region->beg = (int* )0;\r
+ region->end = (int* )0;\r
+ region->history_root = (OnigCaptureTreeNode* )0;\r
+}\r
+\r
+extern OnigRegion*\r
+onig_region_new(void)\r
+{\r
+ OnigRegion* r;\r
+\r
+ r = (OnigRegion* )xmalloc(sizeof(OnigRegion));\r
+ onig_region_init(r);\r
+ return r;\r
+}\r
+\r
+extern void\r
+onig_region_free(OnigRegion* r, int free_self)\r
+{\r
+ if (r) {\r
+ if (r->allocated > 0) {\r
+ if (r->beg) xfree(r->beg);\r
+ if (r->end) xfree(r->end);\r
+ r->allocated = 0;\r
+ }\r
+#ifdef USE_CAPTURE_HISTORY\r
+ history_root_free(r);\r
+#endif\r
+ if (free_self) xfree(r);\r
+ }\r
+}\r
+\r
+extern void\r
+onig_region_copy(OnigRegion* to, OnigRegion* from)\r
+{\r
+#define RREGC_SIZE (sizeof(int) * from->num_regs)\r
+ int i;\r
+\r
+ if (to == from) return;\r
+\r
+ if (to->allocated == 0) {\r
+ if (from->num_regs > 0) {\r
+ to->beg = (int* )xmalloc(RREGC_SIZE);\r
+ to->end = (int* )xmalloc(RREGC_SIZE);\r
+ to->allocated = from->num_regs;\r
+ }\r
+ }\r
+ else if (to->allocated < from->num_regs) {\r
+ to->beg = (int* )xrealloc(to->beg, RREGC_SIZE, sizeof(int) * to->allocated);\r
+ to->end = (int* )xrealloc(to->end, RREGC_SIZE, sizeof(int) * to->allocated);\r
+ to->allocated = from->num_regs;\r
+ }\r
+\r
+ for (i = 0; i < from->num_regs; i++) {\r
+ to->beg[i] = from->beg[i];\r
+ to->end[i] = from->end[i];\r
+ }\r
+ to->num_regs = from->num_regs;\r
+\r
+#ifdef USE_CAPTURE_HISTORY\r
+ history_root_free(to);\r
+\r
+ if (IS_NOT_NULL(from->history_root)) {\r
+ to->history_root = history_tree_clone(from->history_root);\r
+ }\r
+#endif\r
+}\r
+\r
+\r
+/** stack **/\r
+#define INVALID_STACK_INDEX -1\r
+\r
+/* stack type */\r
+/* used by normal-POP */\r
+#define STK_ALT 0x0001\r
+#define STK_LOOK_BEHIND_NOT 0x0002\r
+#define STK_POS_NOT 0x0003\r
+/* handled by normal-POP */\r
+#define STK_MEM_START 0x0100\r
+#define STK_MEM_END 0x8200\r
+#define STK_REPEAT_INC 0x0300\r
+#define STK_STATE_CHECK_MARK 0x1000\r
+/* avoided by normal-POP */\r
+#define STK_NULL_CHECK_START 0x3000\r
+#define STK_NULL_CHECK_END 0x5000 /* for recursive call */\r
+#define STK_MEM_END_MARK 0x8400\r
+#define STK_POS 0x0500 /* used when POP-POS */\r
+#define STK_STOP_BT 0x0600 /* mark for "(?>...)" */\r
+#define STK_REPEAT 0x0700\r
+#define STK_CALL_FRAME 0x0800\r
+#define STK_RETURN 0x0900\r
+#define STK_VOID 0x0a00 /* for fill a blank */\r
+\r
+/* stack type check mask */\r
+#define STK_MASK_POP_USED 0x00ff\r
+#define STK_MASK_TO_VOID_TARGET 0x10ff\r
+#define STK_MASK_MEM_END_OR_MARK 0x8000 /* MEM_END or MEM_END_MARK */\r
+\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start) do {\\r
+ (msa).stack_p = (void* )0;\\r
+ (msa).options = (arg_option);\\r
+ (msa).region = (arg_region);\\r
+ (msa).start = (arg_start);\\r
+ (msa).best_len = ONIG_MISMATCH;\\r
+} while(0)\r
+#else\r
+#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start) do {\\r
+ (msa).stack_p = (void* )0;\\r
+ (msa).options = (arg_option);\\r
+ (msa).region = (arg_region);\\r
+ (msa).start = (arg_start);\\r
+} while(0)\r
+#endif\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+\r
+#define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE 16\r
+\r
+#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do { \\r
+ if ((state_num) > 0 && str_len >= STATE_CHECK_STRING_THRESHOLD_LEN) {\\r
+ unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\\r
+ offset = ((offset) * (state_num)) >> 3;\\r
+ if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\\r
+ if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) \\r
+ (msa).state_check_buff = (void* )xmalloc(size);\\r
+ else \\r
+ (msa).state_check_buff = (void* )xalloca(size);\\r
+ xmemset(((char* )((msa).state_check_buff)+(offset)), 0, \\r
+ (size_t )(size - (offset))); \\r
+ (msa).state_check_buff_size = size;\\r
+ }\\r
+ else {\\r
+ (msa).state_check_buff = (void* )0;\\r
+ (msa).state_check_buff_size = 0;\\r
+ }\\r
+ }\\r
+ else {\\r
+ (msa).state_check_buff = (void* )0;\\r
+ (msa).state_check_buff_size = 0;\\r
+ }\\r
+ } while(0)\r
+\r
+#define MATCH_ARG_FREE(msa) do {\\r
+ if ((msa).stack_p) xfree((msa).stack_p);\\r
+ if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \\r
+ if ((msa).state_check_buff) xfree((msa).state_check_buff);\\r
+ }\\r
+} while(0)\r
+#else\r
+#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num)\r
+#define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p)\r
+#endif\r
+\r
+\r
+\r
+#define STACK_INIT(alloc_addr, ptr_num, stack_num) do {\\r
+ if (msa->stack_p) {\\r
+ alloc_addr = (char* )xmalloc(sizeof(char*) * (ptr_num));\\r
+ stk_alloc = (OnigStackType* )(msa->stack_p);\\r
+ stk_base = stk_alloc;\\r
+ stk = stk_base;\\r
+ stk_end = stk_base + msa->stack_n;\\r
+ }\\r
+ else {\\r
+ alloc_addr = (char* )xmalloc(sizeof(char*) * (ptr_num)\\r
+ + sizeof(OnigStackType) * (stack_num));\\r
+ stk_alloc = (OnigStackType* )(alloc_addr + sizeof(char*) * (ptr_num));\\r
+ stk_base = stk_alloc;\\r
+ stk = stk_base;\\r
+ stk_end = stk_base + (stack_num);\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_SAVE do{\\r
+ if (stk_base != stk_alloc) {\\r
+ msa->stack_p = stk_base;\\r
+ msa->stack_n = (int)(stk_end - stk_base);\\r
+ };\\r
+} while(0)\r
+\r
+static unsigned int MatchStackLimitSize = DEFAULT_MATCH_STACK_LIMIT_SIZE;\r
+\r
+extern unsigned int\r
+onig_get_match_stack_limit_size(void)\r
+{\r
+ return MatchStackLimitSize;\r
+}\r
+\r
+extern int\r
+onig_set_match_stack_limit_size(unsigned int size)\r
+{\r
+ MatchStackLimitSize = size;\r
+ return 0;\r
+}\r
+\r
+static int\r
+stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end,\r
+ OnigStackType** arg_stk, OnigStackType* stk_alloc, OnigMatchArg* msa)\r
+{\r
+ unsigned int n;\r
+ OnigStackType *x, *stk_base, *stk_end, *stk;\r
+\r
+ stk_base = *arg_stk_base;\r
+ stk_end = *arg_stk_end;\r
+ stk = *arg_stk;\r
+\r
+ n = (unsigned int)(stk_end - stk_base);\r
+ if (stk_base == stk_alloc && IS_NULL(msa->stack_p)) {\r
+ x = (OnigStackType* )xmalloc(sizeof(OnigStackType) * n * 2);\r
+ if (IS_NULL(x)) {\r
+ STACK_SAVE;\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ xmemcpy(x, stk_base, n * sizeof(OnigStackType));\r
+ n *= 2;\r
+ }\r
+ else {\r
+ n *= 2;\r
+ if (MatchStackLimitSize != 0 && n > MatchStackLimitSize) {\r
+ if ((unsigned int )(stk_end - stk_base) == MatchStackLimitSize)\r
+ return ONIGERR_MATCH_STACK_LIMIT_OVER;\r
+ else\r
+ n = MatchStackLimitSize;\r
+ }\r
+ x = (OnigStackType* )xrealloc(stk_base, sizeof(OnigStackType) * n, sizeof(OnigStackType) * (stk_end - stk_base));\r
+ if (IS_NULL(x)) {\r
+ STACK_SAVE;\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ }\r
+ *arg_stk = x + (stk - stk_base);\r
+ *arg_stk_base = x;\r
+ *arg_stk_end = x + n;\r
+ return 0;\r
+}\r
+\r
+#define STACK_ENSURE(n) do {\\r
+ if (stk_end - stk < (n)) {\\r
+ int r = stack_double(&stk_base, &stk_end, &stk, stk_alloc, msa);\\r
+ if (r != 0) { STACK_SAVE; return r; } \\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_AT(index) (stk_base + (index))\r
+#define GET_STACK_INDEX(stk) ((OnigStackIndex)((stk) - stk_base))\r
+\r
+#define STACK_PUSH_TYPE(stack_type) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = (stack_type);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define IS_TO_VOID_TARGET(stk) (((stk)->type & STK_MASK_TO_VOID_TARGET) != 0)\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+#define STATE_CHECK_POS(s,snum) \\r
+ (((s) - str) * num_comb_exp_check + ((snum) - 1))\r
+#define STATE_CHECK_VAL(v,snum) do {\\r
+ if (state_check_buff != NULL) {\\r
+ int x = STATE_CHECK_POS(s,snum);\\r
+ (v) = state_check_buff[x/8] & (1<<(x%8));\\r
+ }\\r
+ else (v) = 0;\\r
+} while(0)\r
+\r
+\r
+#define ELSE_IF_STATE_CHECK_MARK(stk) \\r
+ else if ((stk)->type == STK_STATE_CHECK_MARK) { \\r
+ int x = STATE_CHECK_POS(stk->u.state.pstr, stk->u.state.state_check);\\r
+ state_check_buff[x/8] |= (1<<(x%8)); \\r
+ }\r
+\r
+#define STACK_PUSH(stack_type,pat,s,sprev) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = (stack_type);\\r
+ stk->u.state.pcode = (pat);\\r
+ stk->u.state.pstr = (s);\\r
+ stk->u.state.pstr_prev = (sprev);\\r
+ stk->u.state.state_check = 0;\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_ENSURED(stack_type,pat) do {\\r
+ stk->type = (stack_type);\\r
+ stk->u.state.pcode = (pat);\\r
+ stk->u.state.state_check = 0;\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_ALT;\\r
+ stk->u.state.pcode = (pat);\\r
+ stk->u.state.pstr = (s);\\r
+ stk->u.state.pstr_prev = (sprev);\\r
+ stk->u.state.state_check = ((state_check_buff != NULL) ? (snum) : 0);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_STATE_CHECK(s,snum) do {\\r
+ if (state_check_buff != NULL) {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_STATE_CHECK_MARK;\\r
+ stk->u.state.pstr = (s);\\r
+ stk->u.state.state_check = (snum);\\r
+ STACK_INC;\\r
+ }\\r
+} while(0)\r
+\r
+#else /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+#define ELSE_IF_STATE_CHECK_MARK(stk)\r
+\r
+#define STACK_PUSH(stack_type,pat,s,sprev) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = (stack_type);\\r
+ stk->u.state.pcode = (pat);\\r
+ stk->u.state.pstr = (s);\\r
+ stk->u.state.pstr_prev = (sprev);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_ENSURED(stack_type,pat) do {\\r
+ stk->type = (stack_type);\\r
+ stk->u.state.pcode = (pat);\\r
+ STACK_INC;\\r
+} while(0)\r
+#endif /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+#define STACK_PUSH_ALT(pat,s,sprev) STACK_PUSH(STK_ALT,pat,s,sprev)\r
+#define STACK_PUSH_POS(s,sprev) STACK_PUSH(STK_POS,NULL_UCHARP,s,sprev)\r
+#define STACK_PUSH_POS_NOT(pat,s,sprev) STACK_PUSH(STK_POS_NOT,pat,s,sprev)\r
+#define STACK_PUSH_STOP_BT STACK_PUSH_TYPE(STK_STOP_BT)\r
+#define STACK_PUSH_LOOK_BEHIND_NOT(pat,s,sprev) \\r
+ STACK_PUSH(STK_LOOK_BEHIND_NOT,pat,s,sprev)\r
+\r
+#define STACK_PUSH_REPEAT(id, pat) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_REPEAT;\\r
+ stk->u.repeat.num = (id);\\r
+ stk->u.repeat.pcode = (pat);\\r
+ stk->u.repeat.count = 0;\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_REPEAT_INC(sindex) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_REPEAT_INC;\\r
+ stk->u.repeat_inc.si = (sindex);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_MEM_START(mnum, s) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_MEM_START;\\r
+ stk->u.mem.num = (int)(mnum);\\r
+ stk->u.mem.pstr = (s);\\r
+ stk->u.mem.start = mem_start_stk[mnum];\\r
+ stk->u.mem.end = mem_end_stk[mnum];\\r
+ mem_start_stk[mnum] = GET_STACK_INDEX(stk);\\r
+ mem_end_stk[mnum] = INVALID_STACK_INDEX;\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_MEM_END(mnum, s) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_MEM_END;\\r
+ stk->u.mem.num = (mnum);\\r
+ stk->u.mem.pstr = (s);\\r
+ stk->u.mem.start = mem_start_stk[mnum];\\r
+ stk->u.mem.end = mem_end_stk[mnum];\\r
+ mem_end_stk[mnum] = GET_STACK_INDEX(stk);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_MEM_END_MARK(mnum) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_MEM_END_MARK;\\r
+ stk->u.mem.num = (mnum);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_GET_MEM_START(mnum, k) do {\\r
+ int level = 0;\\r
+ k = stk;\\r
+ while (k > stk_base) {\\r
+ k--;\\r
+ if ((k->type & STK_MASK_MEM_END_OR_MARK) != 0 \\r
+ && k->u.mem.num == (mnum)) {\\r
+ level++;\\r
+ }\\r
+ else if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\\r
+ if (level == 0) break;\\r
+ level--;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_GET_MEM_RANGE(k, mnum, start, end) do {\\r
+ int level = 0;\\r
+ while (k < stk) {\\r
+ if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\\r
+ if (level == 0) (start) = k->u.mem.pstr;\\r
+ level++;\\r
+ }\\r
+ else if (k->type == STK_MEM_END && k->u.mem.num == (mnum)) {\\r
+ level--;\\r
+ if (level == 0) {\\r
+ (end) = k->u.mem.pstr;\\r
+ break;\\r
+ }\\r
+ }\\r
+ k++;\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_NULL_CHECK_START;\\r
+ stk->u.null_check.num = (cnum);\\r
+ stk->u.null_check.pstr = (s);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_NULL_CHECK_END(cnum) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_NULL_CHECK_END;\\r
+ stk->u.null_check.num = (cnum);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_CALL_FRAME(pat) do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_CALL_FRAME;\\r
+ stk->u.call_frame.ret_addr = (pat);\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+#define STACK_PUSH_RETURN do {\\r
+ STACK_ENSURE(1);\\r
+ stk->type = STK_RETURN;\\r
+ STACK_INC;\\r
+} while(0)\r
+\r
+\r
+#ifdef ONIG_DEBUG\r
+#define STACK_BASE_CHECK(p, at) \\r
+ if ((p) < stk_base) {\\r
+ fprintf(stderr, "at %s\n", at);\\r
+ goto stack_error;\\r
+ }\r
+#else\r
+#define STACK_BASE_CHECK(p, at)\r
+#endif\r
+\r
+#define STACK_POP_ONE do {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP_ONE"); \\r
+} while(0)\r
+\r
+#define STACK_POP do {\\r
+ switch (pop_level) {\\r
+ case STACK_POP_LEVEL_FREE:\\r
+ while (1) {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP"); \\r
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\\r
+ ELSE_IF_STATE_CHECK_MARK(stk);\\r
+ }\\r
+ break;\\r
+ case STACK_POP_LEVEL_MEM_START:\\r
+ while (1) {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP 2"); \\r
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\\r
+ else if (stk->type == STK_MEM_START) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ ELSE_IF_STATE_CHECK_MARK(stk);\\r
+ }\\r
+ break;\\r
+ default:\\r
+ while (1) {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP 3"); \\r
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\\r
+ else if (stk->type == STK_MEM_START) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ else if (stk->type == STK_REPEAT_INC) {\\r
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\r
+ }\\r
+ else if (stk->type == STK_MEM_END) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ ELSE_IF_STATE_CHECK_MARK(stk);\\r
+ }\\r
+ break;\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_POP_TIL_POS_NOT do {\\r
+ while (1) {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP_TIL_POS_NOT"); \\r
+ if (stk->type == STK_POS_NOT) break;\\r
+ else if (stk->type == STK_MEM_START) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ else if (stk->type == STK_REPEAT_INC) {\\r
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\r
+ }\\r
+ else if (stk->type == STK_MEM_END) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ ELSE_IF_STATE_CHECK_MARK(stk);\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_POP_TIL_LOOK_BEHIND_NOT do {\\r
+ while (1) {\\r
+ stk--;\\r
+ STACK_BASE_CHECK(stk, "STACK_POP_TIL_LOOK_BEHIND_NOT"); \\r
+ if (stk->type == STK_LOOK_BEHIND_NOT) break;\\r
+ else if (stk->type == STK_MEM_START) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ else if (stk->type == STK_REPEAT_INC) {\\r
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\r
+ }\\r
+ else if (stk->type == STK_MEM_END) {\\r
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\r
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\\r
+ }\\r
+ ELSE_IF_STATE_CHECK_MARK(stk);\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_POS_END(k) do {\\r
+ k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_POS_END"); \\r
+ if (IS_TO_VOID_TARGET(k)) {\\r
+ k->type = STK_VOID;\\r
+ }\\r
+ else if (k->type == STK_POS) {\\r
+ k->type = STK_VOID;\\r
+ break;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_STOP_BT_END do {\\r
+ OnigStackType *k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_STOP_BT_END"); \\r
+ if (IS_TO_VOID_TARGET(k)) {\\r
+ k->type = STK_VOID;\\r
+ }\\r
+ else if (k->type == STK_STOP_BT) {\\r
+ k->type = STK_VOID;\\r
+ break;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_NULL_CHECK(isnull,id,s) do {\\r
+ OnigStackType* k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK"); \\r
+ if (k->type == STK_NULL_CHECK_START) {\\r
+ if (k->u.null_check.num == (id)) {\\r
+ (isnull) = (k->u.null_check.pstr == (s));\\r
+ break;\\r
+ }\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_NULL_CHECK_REC(isnull,id,s) do {\\r
+ int level = 0;\\r
+ OnigStackType* k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_REC"); \\r
+ if (k->type == STK_NULL_CHECK_START) {\\r
+ if (k->u.null_check.num == (id)) {\\r
+ if (level == 0) {\\r
+ (isnull) = (k->u.null_check.pstr == (s));\\r
+ break;\\r
+ }\\r
+ else level--;\\r
+ }\\r
+ }\\r
+ else if (k->type == STK_NULL_CHECK_END) {\\r
+ level++;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\\r
+ OnigStackType* k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST"); \\r
+ if (k->type == STK_NULL_CHECK_START) {\\r
+ if (k->u.null_check.num == (id)) {\\r
+ if (k->u.null_check.pstr != (s)) {\\r
+ (isnull) = 0;\\r
+ break;\\r
+ }\\r
+ else {\\r
+ UChar* endp;\\r
+ (isnull) = 1;\\r
+ while (k < stk) {\\r
+ if (k->type == STK_MEM_START) {\\r
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\\r
+ (isnull) = 0; break;\\r
+ }\\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\\r
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\\r
+ else\\r
+ endp = (UChar* )k->u.mem.end;\\r
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\\r
+ (isnull) = 0; break;\\r
+ }\\r
+ else if (endp != s) {\\r
+ (isnull) = -1; /* empty, but position changed */ \\r
+ }\\r
+ }\\r
+ k++;\\r
+ }\\r
+ break;\\r
+ }\\r
+ }\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\\r
+ int level = 0;\\r
+ OnigStackType* k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST_REC"); \\r
+ if (k->type == STK_NULL_CHECK_START) {\\r
+ if (k->u.null_check.num == (id)) {\\r
+ if (level == 0) {\\r
+ if (k->u.null_check.pstr != (s)) {\\r
+ (isnull) = 0;\\r
+ break;\\r
+ }\\r
+ else {\\r
+ UChar* endp;\\r
+ (isnull) = 1;\\r
+ while (k < stk) {\\r
+ if (k->type == STK_MEM_START) {\\r
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\\r
+ (isnull) = 0; break;\\r
+ }\\r
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\\r
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\\r
+ else\\r
+ endp = (UChar* )k->u.mem.end;\\r
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\\r
+ (isnull) = 0; break;\\r
+ }\\r
+ else if (endp != s) {\\r
+ (isnull) = -1; /* empty, but position changed */ \\r
+ }\\r
+ }\\r
+ k++;\\r
+ }\\r
+ break;\\r
+ }\\r
+ }\\r
+ else {\\r
+ level--;\\r
+ }\\r
+ }\\r
+ }\\r
+ else if (k->type == STK_NULL_CHECK_END) {\\r
+ if (k->u.null_check.num == (id)) level++;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_GET_REPEAT(id, k) do {\\r
+ int level = 0;\\r
+ k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_GET_REPEAT"); \\r
+ if (k->type == STK_REPEAT) {\\r
+ if (level == 0) {\\r
+ if (k->u.repeat.num == (id)) {\\r
+ break;\\r
+ }\\r
+ }\\r
+ }\\r
+ else if (k->type == STK_CALL_FRAME) level--;\\r
+ else if (k->type == STK_RETURN) level++;\\r
+ }\\r
+} while(0)\r
+\r
+#define STACK_RETURN(addr) do {\\r
+ int level = 0;\\r
+ OnigStackType* k = stk;\\r
+ while (1) {\\r
+ k--;\\r
+ STACK_BASE_CHECK(k, "STACK_RETURN"); \\r
+ if (k->type == STK_CALL_FRAME) {\\r
+ if (level == 0) {\\r
+ (addr) = k->u.call_frame.ret_addr;\\r
+ break;\\r
+ }\\r
+ else level--;\\r
+ }\\r
+ else if (k->type == STK_RETURN)\\r
+ level++;\\r
+ }\\r
+} while(0)\r
+\r
+\r
+#define STRING_CMP(s1,s2,len) do {\\r
+ while (len-- > 0) {\\r
+ if (*s1++ != *s2++) goto fail;\\r
+ }\\r
+} while(0)\r
+\r
+#define STRING_CMP_IC(case_fold_flag,s1,ps2,len) do {\\r
+ if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \\r
+ goto fail; \\r
+} while(0)\r
+\r
+static int string_cmp_ic(OnigEncoding enc, int case_fold_flag,\r
+ UChar* s1, UChar** ps2, int mblen)\r
+{\r
+ UChar buf1[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+ UChar buf2[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+ UChar *p1, *p2, *end1, *s2, *end2;\r
+ int len1, len2;\r
+\r
+ s2 = *ps2;\r
+ end1 = s1 + mblen;\r
+ end2 = s2 + mblen;\r
+ while (s1 < end1) {\r
+ len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, end1, buf1);\r
+ len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, end2, buf2);\r
+ if (len1 != len2) return 0;\r
+ p1 = buf1;\r
+ p2 = buf2;\r
+ while (len1-- > 0) {\r
+ if (*p1 != *p2) return 0;\r
+ p1++;\r
+ p2++;\r
+ }\r
+ }\r
+\r
+ *ps2 = s2;\r
+ return 1;\r
+}\r
+\r
+#define STRING_CMP_VALUE(s1,s2,len,is_fail) do {\\r
+ is_fail = 0;\\r
+ while (len-- > 0) {\\r
+ if (*s1++ != *s2++) {\\r
+ is_fail = 1; break;\\r
+ }\\r
+ }\\r
+} while(0)\r
+\r
+#define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,is_fail) do {\\r
+ if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \\r
+ is_fail = 1; \\r
+ else \\r
+ is_fail = 0; \\r
+} while(0)\r
+\r
+\r
+#define IS_EMPTY_STR (str == end)\r
+#define ON_STR_BEGIN(s) ((s) == str)\r
+#define ON_STR_END(s) ((s) == end)\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+#define DATA_ENSURE_CHECK1 (s < right_range)\r
+#define DATA_ENSURE_CHECK(n) (s + (n) <= right_range)\r
+#define DATA_ENSURE(n) if (s + (n) > right_range) goto fail\r
+#else\r
+#define DATA_ENSURE_CHECK1 (s < end)\r
+#define DATA_ENSURE_CHECK(n) (s + (n) <= end)\r
+#define DATA_ENSURE(n) if (s + (n) > end) goto fail\r
+#endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */\r
+\r
+\r
+#ifdef USE_CAPTURE_HISTORY\r
+static int\r
+make_capture_history_tree(OnigCaptureTreeNode* node, OnigStackType** kp,\r
+ OnigStackType* stk_top, UChar* str, regex_t* reg)\r
+{\r
+ int n, r;\r
+ OnigCaptureTreeNode* child;\r
+ OnigStackType* k = *kp;\r
+\r
+ while (k < stk_top) {\r
+ if (k->type == STK_MEM_START) {\r
+ n = k->u.mem.num;\r
+ if (n <= ONIG_MAX_CAPTURE_HISTORY_GROUP &&\r
+ BIT_STATUS_AT(reg->capture_history, n) != 0) {\r
+ child = history_node_new();\r
+ CHECK_NULL_RETURN_MEMERR(child);\r
+ child->group = n;\r
+ child->beg = (int )(k->u.mem.pstr - str);\r
+ r = history_tree_add_child(node, child);\r
+ if (r != 0) return r;\r
+ *kp = (k + 1);\r
+ r = make_capture_history_tree(child, kp, stk_top, str, reg);\r
+ if (r != 0) return r;\r
+\r
+ k = *kp;\r
+ child->end = (int )(k->u.mem.pstr - str);\r
+ }\r
+ }\r
+ else if (k->type == STK_MEM_END) {\r
+ if (k->u.mem.num == node->group) {\r
+ node->end = (int )(k->u.mem.pstr - str);\r
+ *kp = k;\r
+ return 0;\r
+ }\r
+ }\r
+ k++;\r
+ }\r
+\r
+ return 1; /* 1: root node ending. */\r
+}\r
+#endif\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+static int mem_is_in_memp(int mem, int num, UChar* memp)\r
+{\r
+ int i;\r
+ MemNumType m;\r
+\r
+ for (i = 0; i < num; i++) {\r
+ GET_MEMNUM_INC(m, memp);\r
+ if (mem == (int )m) return 1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int backref_match_at_nested_level(regex_t* reg\r
+ , OnigStackType* top, OnigStackType* stk_base\r
+ , int ignore_case, int case_fold_flag\r
+ , int nest, int mem_num, UChar* memp, UChar** s, const UChar* send)\r
+{\r
+ UChar *ss, *p, *pstart, *pend = NULL_UCHARP;\r
+ int level;\r
+ OnigStackType* k;\r
+\r
+ level = 0;\r
+ k = top;\r
+ k--;\r
+ while (k >= stk_base) {\r
+ if (k->type == STK_CALL_FRAME) {\r
+ level--;\r
+ }\r
+ else if (k->type == STK_RETURN) {\r
+ level++;\r
+ }\r
+ else if (level == nest) {\r
+ if (k->type == STK_MEM_START) {\r
+ if (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {\r
+ pstart = k->u.mem.pstr;\r
+ if (pend != NULL_UCHARP) {\r
+ if (pend - pstart > send - *s) return 0; /* or goto next_mem; */\r
+ p = pstart;\r
+ ss = *s;\r
+\r
+ if (ignore_case != 0) {\r
+ if (string_cmp_ic(reg->enc, case_fold_flag,\r
+ pstart, &ss, (int )(pend - pstart)) == 0)\r
+ return 0; /* or goto next_mem; */\r
+ }\r
+ else {\r
+ while (p < pend) {\r
+ if (*p++ != *ss++) return 0; /* or goto next_mem; */\r
+ }\r
+ }\r
+\r
+ *s = ss;\r
+ return 1;\r
+ }\r
+ }\r
+ }\r
+ else if (k->type == STK_MEM_END) {\r
+ if (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {\r
+ pend = k->u.mem.pstr;\r
+ }\r
+ }\r
+ }\r
+ k--;\r
+ }\r
+\r
+ return 0;\r
+}\r
+#endif /* USE_BACKREF_WITH_LEVEL */\r
+\r
+\r
+#ifdef ONIG_DEBUG_STATISTICS\r
+\r
+#define USE_TIMEOFDAY\r
+\r
+#ifdef USE_TIMEOFDAY\r
+#ifdef HAVE_SYS_TIME_H\r
+#include <sys/time.h>\r
+#endif\r
+#ifdef HAVE_UNISTD_H\r
+#include <unistd.h>\r
+#endif\r
+static struct timeval ts, te;\r
+#define GETTIME(t) gettimeofday(&(t), (struct timezone* )0)\r
+#define TIMEDIFF(te,ts) (((te).tv_usec - (ts).tv_usec) + \\r
+ (((te).tv_sec - (ts).tv_sec)*1000000))\r
+#else\r
+#ifdef HAVE_SYS_TIMES_H\r
+#include <sys/times.h>\r
+#endif\r
+static struct tms ts, te;\r
+#define GETTIME(t) times(&(t))\r
+#define TIMEDIFF(te,ts) ((te).tms_utime - (ts).tms_utime)\r
+#endif\r
+\r
+static int OpCounter[256];\r
+static int OpPrevCounter[256];\r
+static unsigned long OpTime[256];\r
+static int OpCurr = OP_FINISH;\r
+static int OpPrevTarget = OP_FAIL;\r
+static int MaxStackDepth = 0;\r
+\r
+#define MOP_IN(opcode) do {\\r
+ if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\\r
+ OpCurr = opcode;\\r
+ OpCounter[opcode]++;\\r
+ GETTIME(ts);\\r
+} while(0)\r
+\r
+#define MOP_OUT do {\\r
+ GETTIME(te);\\r
+ OpTime[OpCurr] += TIMEDIFF(te, ts);\\r
+} while(0)\r
+\r
+extern void\r
+onig_statistics_init(void)\r
+{\r
+ int i;\r
+ for (i = 0; i < 256; i++) {\r
+ OpCounter[i] = OpPrevCounter[i] = 0; OpTime[i] = 0;\r
+ }\r
+ MaxStackDepth = 0;\r
+}\r
+\r
+extern void\r
+onig_print_statistics(FILE* f)\r
+{\r
+ int i;\r
+ fprintf(f, " count prev time\n");\r
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\r
+ fprintf(f, "%8d: %8d: %10ld: %s\n",\r
+ OpCounter[i], OpPrevCounter[i], OpTime[i], OnigOpInfo[i].name);\r
+ }\r
+ fprintf(f, "\nmax stack depth: %d\n", MaxStackDepth);\r
+}\r
+\r
+#define STACK_INC do {\\r
+ stk++;\\r
+ if (stk - stk_base > MaxStackDepth) \\r
+ MaxStackDepth = stk - stk_base;\\r
+} while(0)\r
+\r
+#else\r
+#define STACK_INC stk++\r
+\r
+#define MOP_IN(opcode)\r
+#define MOP_OUT\r
+#endif\r
+\r
+\r
+/* matching region of POSIX API */\r
+typedef int regoff_t;\r
+\r
+typedef struct {\r
+ regoff_t rm_so;\r
+ regoff_t rm_eo;\r
+} posix_regmatch_t;\r
+\r
+/* match data(str - end) from position (sstart). */\r
+/* if sstart == str then set sprev to NULL. */\r
+static int\r
+match_at(regex_t* reg, const UChar* str, const UChar* end,\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+ const UChar* right_range,\r
+#endif\r
+ const UChar* sstart, UChar* sprev, OnigMatchArg* msa)\r
+{\r
+ static UChar FinishCode[] = { OP_FINISH };\r
+\r
+ int i, n, num_mem, best_len, pop_level;\r
+ LengthType tlen, tlen2;\r
+ MemNumType mem;\r
+ RelAddrType addr;\r
+ OnigOptionType option = reg->options;\r
+ OnigEncoding encode = reg->enc;\r
+ OnigCaseFoldType case_fold_flag = reg->case_fold_flag;\r
+ UChar *s, *q, *sbegin;\r
+ UChar *p = reg->p;\r
+ char *alloca_base;\r
+ OnigStackType *stk_alloc, *stk_base, *stk, *stk_end;\r
+ OnigStackType *stkp; /* used as any purpose. */\r
+ OnigStackIndex si;\r
+ OnigStackIndex *repeat_stk;\r
+ OnigStackIndex *mem_start_stk, *mem_end_stk;\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ int scv;\r
+ unsigned char* state_check_buff = msa->state_check_buff;\r
+ int num_comb_exp_check = reg->num_comb_exp_check;\r
+#endif\r
+ n = reg->num_repeat + reg->num_mem * 2;\r
+\r
+ STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);\r
+ pop_level = reg->stack_pop_level;\r
+ num_mem = reg->num_mem;\r
+ repeat_stk = (OnigStackIndex* )alloca_base;\r
+\r
+ mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat);\r
+ mem_end_stk = mem_start_stk + num_mem;\r
+ mem_start_stk--; /* for index start from 1,\r
+ mem_start_stk[1]..mem_start_stk[num_mem] */\r
+ mem_end_stk--; /* for index start from 1,\r
+ mem_end_stk[1]..mem_end_stk[num_mem] */\r
+ for (i = 1; i <= num_mem; i++) {\r
+ mem_start_stk[i] = mem_end_stk[i] = INVALID_STACK_INDEX;\r
+ }\r
+\r
+#ifdef ONIG_DEBUG_MATCH\r
+ fprintf(stderr, "match_at: str: %d, end: %d, start: %d, sprev: %d\n",\r
+ (int )str, (int )end, (int )sstart, (int )sprev);\r
+ fprintf(stderr, "size: %d, start offset: %d\n",\r
+ (int )(end - str), (int )(sstart - str));\r
+#endif\r
+\r
+ STACK_PUSH_ENSURED(STK_ALT, FinishCode); /* bottom stack */\r
+ best_len = ONIG_MISMATCH;\r
+ s = (UChar* )sstart;\r
+ while (1) {\r
+#ifdef ONIG_DEBUG_MATCH\r
+ {\r
+ UChar *q, *bp, buf[50];\r
+ int len;\r
+ fprintf(stderr, "%4d> \"", (int )(s - str));\r
+ bp = buf;\r
+ for (i = 0, q = s; i < 7 && q < end; i++) {\r
+ len = enclen(encode, q);\r
+ while (len-- > 0) *bp++ = *q++;\r
+ }\r
+ if (q < end) { xmemcpy(bp, "...\"", 4); bp += 4; }\r
+ else { xmemcpy(bp, "\"", 1); bp += 1; }\r
+ *bp = 0;\r
+ fputs((char* )buf, stderr);\r
+ for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr);\r
+ onig_print_compiled_byte_code(stderr, p, NULL, encode);\r
+ fprintf(stderr, "\n");\r
+ }\r
+#endif\r
+\r
+ sbegin = s;\r
+ switch (*p++) {\r
+ case OP_END: MOP_IN(OP_END);\r
+ n = (int)(s - sstart);\r
+ if (n > best_len) {\r
+ OnigRegion* region;\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+ if (IS_FIND_LONGEST(option)) {\r
+ if (n > msa->best_len) {\r
+ msa->best_len = n;\r
+ msa->best_s = (UChar* )sstart;\r
+ }\r
+ else\r
+ goto end_best_len;\r
+ }\r
+#endif\r
+ best_len = n;\r
+ region = msa->region;\r
+ if (region) {\r
+#ifdef USE_POSIX_API_REGION_OPTION\r
+ if (IS_POSIX_REGION(msa->options)) {\r
+ posix_regmatch_t* rmt = (posix_regmatch_t* )region;\r
+\r
+ rmt[0].rm_so = (regoff_t)(sstart - str);\r
+ rmt[0].rm_eo = (regoff_t)(s - str);\r
+ for (i = 1; i <= num_mem; i++) {\r
+ if (mem_end_stk[i] != INVALID_STACK_INDEX) {\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))\r
+ rmt[i].rm_so = (regoff_t)(STACK_AT(mem_start_stk[i])->u.mem.pstr - str);\r
+ else\r
+ rmt[i].rm_so = (regoff_t)((UChar* )((void* )(mem_start_stk[i])) - str);\r
+\r
+ rmt[i].rm_eo = (regoff_t)((BIT_STATUS_AT(reg->bt_mem_end, i)\r
+ ? STACK_AT(mem_end_stk[i])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[i])) - str);\r
+ }\r
+ else {\r
+ rmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS;\r
+ }\r
+ }\r
+ }\r
+ else {\r
+#endif /* USE_POSIX_API_REGION_OPTION */\r
+ region->beg[0] = (int)(sstart - str);\r
+ region->end[0] = (int)(s - str);\r
+ for (i = 1; i <= num_mem; i++) {\r
+ if (mem_end_stk[i] != INVALID_STACK_INDEX) {\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))\r
+ region->beg[i] = (int)(STACK_AT(mem_start_stk[i])->u.mem.pstr - str);\r
+ else\r
+ region->beg[i] = (int)((UChar* )((void* )mem_start_stk[i]) - str);\r
+\r
+ region->end[i] = (int)((BIT_STATUS_AT(reg->bt_mem_end, i)\r
+ ? STACK_AT(mem_end_stk[i])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[i])) - str);\r
+ }\r
+ else {\r
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;\r
+ }\r
+ }\r
+\r
+#ifdef USE_CAPTURE_HISTORY\r
+ if (reg->capture_history != 0) {\r
+ int r;\r
+ OnigCaptureTreeNode* node;\r
+\r
+ if (IS_NULL(region->history_root)) {\r
+ region->history_root = node = history_node_new();\r
+ CHECK_NULL_RETURN_MEMERR(node);\r
+ }\r
+ else {\r
+ node = region->history_root;\r
+ history_tree_clear(node);\r
+ }\r
+\r
+ node->group = 0;\r
+ node->beg = (int)(sstart - str);\r
+ node->end = (int)(s - str);\r
+\r
+ stkp = stk_base;\r
+ r = make_capture_history_tree(region->history_root, &stkp,\r
+ stk, (UChar* )str, reg);\r
+ if (r < 0) {\r
+ best_len = r; /* error code */\r
+ goto finish;\r
+ }\r
+ }\r
+#endif /* USE_CAPTURE_HISTORY */\r
+#ifdef USE_POSIX_API_REGION_OPTION\r
+ } /* else IS_POSIX_REGION() */\r
+#endif\r
+ } /* if (region) */\r
+ } /* n > best_len */\r
+\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+ end_best_len:\r
+#endif\r
+ MOP_OUT;\r
+\r
+ if (IS_FIND_CONDITION(option)) {\r
+ if (IS_FIND_NOT_EMPTY(option) && s == sstart) {\r
+ best_len = ONIG_MISMATCH;\r
+ goto fail; /* for retry */\r
+ }\r
+ if (IS_FIND_LONGEST(option) && DATA_ENSURE_CHECK1) {\r
+ goto fail; /* for retry */\r
+ }\r
+ }\r
+\r
+ /* default behavior: return first-matching result. */\r
+ goto finish;\r
+ break;\r
+\r
+ case OP_EXACT1: MOP_IN(OP_EXACT1);\r
+#if 0\r
+ DATA_ENSURE(1);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+#endif\r
+ if (*p != *s++) goto fail;\r
+ DATA_ENSURE(0);\r
+ p++;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_EXACT1_IC: MOP_IN(OP_EXACT1_IC);\r
+ {\r
+ int len;\r
+ UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+\r
+ DATA_ENSURE(1);\r
+ len = ONIGENC_MBC_CASE_FOLD(encode,\r
+ /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */\r
+ case_fold_flag,\r
+ &s, end, lowbuf);\r
+ DATA_ENSURE(0);\r
+ q = lowbuf;\r
+ while (len-- > 0) {\r
+ if (*p != *q) {\r
+ goto fail;\r
+ }\r
+ p++; q++;\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_EXACT2: MOP_IN(OP_EXACT2);\r
+ DATA_ENSURE(2);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ sprev = s;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACT3: MOP_IN(OP_EXACT3);\r
+ DATA_ENSURE(3);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ sprev = s;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACT4: MOP_IN(OP_EXACT4);\r
+ DATA_ENSURE(4);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ sprev = s;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACT5: MOP_IN(OP_EXACT5);\r
+ DATA_ENSURE(5);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ sprev = s;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTN: MOP_IN(OP_EXACTN);\r
+ GET_LENGTH_INC(tlen, p);\r
+ DATA_ENSURE(tlen);\r
+ while (tlen-- > 0) {\r
+ if (*p++ != *s++) goto fail;\r
+ }\r
+ sprev = s - 1;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTN_IC: MOP_IN(OP_EXACTN_IC);\r
+ {\r
+ int len;\r
+ UChar *q, *endp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+\r
+ GET_LENGTH_INC(tlen, p);\r
+ endp = p + tlen;\r
+\r
+ while (p < endp) {\r
+ sprev = s;\r
+ DATA_ENSURE(1);\r
+ len = ONIGENC_MBC_CASE_FOLD(encode,\r
+ /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */\r
+ case_fold_flag,\r
+ &s, end, lowbuf);\r
+ DATA_ENSURE(0);\r
+ q = lowbuf;\r
+ while (len-- > 0) {\r
+ if (*p != *q) goto fail;\r
+ p++; q++;\r
+ }\r
+ }\r
+ }\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTMB2N1: MOP_IN(OP_EXACTMB2N1);\r
+ DATA_ENSURE(2);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_EXACTMB2N2: MOP_IN(OP_EXACTMB2N2);\r
+ DATA_ENSURE(4);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ sprev = s;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTMB2N3: MOP_IN(OP_EXACTMB2N3);\r
+ DATA_ENSURE(6);\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ sprev = s;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTMB2N: MOP_IN(OP_EXACTMB2N);\r
+ GET_LENGTH_INC(tlen, p);\r
+ DATA_ENSURE(tlen * 2);\r
+ while (tlen-- > 0) {\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ }\r
+ sprev = s - 2;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTMB3N: MOP_IN(OP_EXACTMB3N);\r
+ GET_LENGTH_INC(tlen, p);\r
+ DATA_ENSURE(tlen * 3);\r
+ while (tlen-- > 0) {\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ }\r
+ sprev = s - 3;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_EXACTMBN: MOP_IN(OP_EXACTMBN);\r
+ GET_LENGTH_INC(tlen, p); /* mb-len */\r
+ GET_LENGTH_INC(tlen2, p); /* string len */\r
+ tlen2 *= tlen;\r
+ DATA_ENSURE(tlen2);\r
+ while (tlen2-- > 0) {\r
+ if (*p != *s) goto fail;\r
+ p++; s++;\r
+ }\r
+ sprev = s - tlen;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_CCLASS: MOP_IN(OP_CCLASS);\r
+ DATA_ENSURE(1);\r
+ if (BITSET_AT(((BitSetRef )p), *s) == 0) goto fail;\r
+ p += SIZE_BITSET;\r
+ s += enclen(encode, s); /* OP_CCLASS can match mb-code. \D, \S */\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_MB: MOP_IN(OP_CCLASS_MB);\r
+ if (! ONIGENC_IS_MBC_HEAD(encode, s)) goto fail;\r
+\r
+ cclass_mb:\r
+ GET_LENGTH_INC(tlen, p);\r
+ {\r
+ OnigCodePoint code;\r
+ UChar *ss;\r
+ int mb_len;\r
+\r
+ DATA_ENSURE(1);\r
+ mb_len = enclen(encode, s);\r
+ DATA_ENSURE(mb_len);\r
+ ss = s;\r
+ s += mb_len;\r
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);\r
+\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ if (! onig_is_in_code_range(p, code)) goto fail;\r
+#else\r
+ q = p;\r
+ ALIGNMENT_RIGHT(q);\r
+ if (! onig_is_in_code_range(q, code)) goto fail;\r
+#endif\r
+ }\r
+ p += tlen;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_MIX: MOP_IN(OP_CCLASS_MIX);\r
+ DATA_ENSURE(1);\r
+ if (ONIGENC_IS_MBC_HEAD(encode, s)) {\r
+ p += SIZE_BITSET;\r
+ goto cclass_mb;\r
+ }\r
+ else {\r
+ if (BITSET_AT(((BitSetRef )p), *s) == 0)\r
+ goto fail;\r
+\r
+ p += SIZE_BITSET;\r
+ GET_LENGTH_INC(tlen, p);\r
+ p += tlen;\r
+ s++;\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_NOT: MOP_IN(OP_CCLASS_NOT);\r
+ DATA_ENSURE(1);\r
+ if (BITSET_AT(((BitSetRef )p), *s) != 0) goto fail;\r
+ p += SIZE_BITSET;\r
+ s += enclen(encode, s);\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_MB_NOT: MOP_IN(OP_CCLASS_MB_NOT);\r
+ DATA_ENSURE(1);\r
+ if (! ONIGENC_IS_MBC_HEAD(encode, s)) {\r
+ s++;\r
+ GET_LENGTH_INC(tlen, p);\r
+ p += tlen;\r
+ goto cc_mb_not_success;\r
+ }\r
+\r
+ cclass_mb_not:\r
+ GET_LENGTH_INC(tlen, p);\r
+ {\r
+ OnigCodePoint code;\r
+ UChar *ss;\r
+ int mb_len = enclen(encode, s);\r
+\r
+ if (! DATA_ENSURE_CHECK(mb_len)) {\r
+ DATA_ENSURE(1);\r
+ s = (UChar* )end;\r
+ p += tlen;\r
+ goto cc_mb_not_success;\r
+ }\r
+\r
+ ss = s;\r
+ s += mb_len;\r
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);\r
+\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+ if (onig_is_in_code_range(p, code)) goto fail;\r
+#else\r
+ q = p;\r
+ ALIGNMENT_RIGHT(q);\r
+ if (onig_is_in_code_range(q, code)) goto fail;\r
+#endif\r
+ }\r
+ p += tlen;\r
+\r
+ cc_mb_not_success:\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_MIX_NOT: MOP_IN(OP_CCLASS_MIX_NOT);\r
+ DATA_ENSURE(1);\r
+ if (ONIGENC_IS_MBC_HEAD(encode, s)) {\r
+ p += SIZE_BITSET;\r
+ goto cclass_mb_not;\r
+ }\r
+ else {\r
+ if (BITSET_AT(((BitSetRef )p), *s) != 0)\r
+ goto fail;\r
+\r
+ p += SIZE_BITSET;\r
+ GET_LENGTH_INC(tlen, p);\r
+ p += tlen;\r
+ s++;\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_CCLASS_NODE: MOP_IN(OP_CCLASS_NODE);\r
+ {\r
+ OnigCodePoint code;\r
+ void *node;\r
+ int mb_len;\r
+ UChar *ss;\r
+\r
+ DATA_ENSURE(1);\r
+ GET_POINTER_INC(node, p);\r
+ mb_len = enclen(encode, s);\r
+ ss = s;\r
+ s += mb_len;\r
+ DATA_ENSURE(0);\r
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);\r
+ if (onig_is_code_in_cc_len(mb_len, code, node) == 0) goto fail;\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR: MOP_IN(OP_ANYCHAR);\r
+ DATA_ENSURE(1);\r
+ n = enclen(encode, s);\r
+ DATA_ENSURE(n);\r
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;\r
+ s += n;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR_ML: MOP_IN(OP_ANYCHAR_ML);\r
+ DATA_ENSURE(1);\r
+ n = enclen(encode, s);\r
+ DATA_ENSURE(n);\r
+ s += n;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR_STAR: MOP_IN(OP_ANYCHAR_STAR);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ STACK_PUSH_ALT(p, s, sprev);\r
+ n = enclen(encode, s);\r
+ DATA_ENSURE(n);\r
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR_ML_STAR: MOP_IN(OP_ANYCHAR_ML_STAR);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ STACK_PUSH_ALT(p, s, sprev);\r
+ n = enclen(encode, s);\r
+ if (n > 1) {\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ else {\r
+ sprev = s;\r
+ s++;\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR_STAR_PEEK_NEXT: MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ if (*p == *s) {\r
+ STACK_PUSH_ALT(p + 1, s, sprev);\r
+ }\r
+ n = enclen(encode, s);\r
+ DATA_ENSURE(n);\r
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ p++;\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:MOP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ if (*p == *s) {\r
+ STACK_PUSH_ALT(p + 1, s, sprev);\r
+ }\r
+ n = enclen(encode, s);\r
+ if (n > 1) {\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ else {\r
+ sprev = s;\r
+ s++;\r
+ }\r
+ }\r
+ p++;\r
+ MOP_OUT;\r
+ break;\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ case OP_STATE_CHECK_ANYCHAR_STAR: MOP_IN(OP_STATE_CHECK_ANYCHAR_STAR);\r
+ GET_STATE_CHECK_NUM_INC(mem, p);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ STATE_CHECK_VAL(scv, mem);\r
+ if (scv) goto fail;\r
+\r
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem);\r
+ n = enclen(encode, s);\r
+ DATA_ENSURE(n);\r
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_STATE_CHECK_ANYCHAR_ML_STAR:\r
+ MOP_IN(OP_STATE_CHECK_ANYCHAR_ML_STAR);\r
+\r
+ GET_STATE_CHECK_NUM_INC(mem, p);\r
+ while (DATA_ENSURE_CHECK1) {\r
+ STATE_CHECK_VAL(scv, mem);\r
+ if (scv) goto fail;\r
+\r
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem);\r
+ n = enclen(encode, s);\r
+ if (n > 1) {\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ s += n;\r
+ }\r
+ else {\r
+ sprev = s;\r
+ s++;\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ break;\r
+#endif /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+ case OP_WORD: MOP_IN(OP_WORD);\r
+ DATA_ENSURE(1);\r
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))\r
+ goto fail;\r
+\r
+ s += enclen(encode, s);\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_NOT_WORD: MOP_IN(OP_NOT_WORD);\r
+ DATA_ENSURE(1);\r
+ if (ONIGENC_IS_MBC_WORD(encode, s, end))\r
+ goto fail;\r
+\r
+ s += enclen(encode, s);\r
+ MOP_OUT;\r
+ break;\r
+\r
+ case OP_WORD_BOUND: MOP_IN(OP_WORD_BOUND);\r
+ if (ON_STR_BEGIN(s)) {\r
+ DATA_ENSURE(1);\r
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))\r
+ goto fail;\r
+ }\r
+ else if (ON_STR_END(s)) {\r
+ if (! ONIGENC_IS_MBC_WORD(encode, sprev, end))\r
+ goto fail;\r
+ }\r
+ else {\r
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)\r
+ == ONIGENC_IS_MBC_WORD(encode, sprev, end))\r
+ goto fail;\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_NOT_WORD_BOUND: MOP_IN(OP_NOT_WORD_BOUND);\r
+ if (ON_STR_BEGIN(s)) {\r
+ if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD(encode, s, end))\r
+ goto fail;\r
+ }\r
+ else if (ON_STR_END(s)) {\r
+ if (ONIGENC_IS_MBC_WORD(encode, sprev, end))\r
+ goto fail;\r
+ }\r
+ else {\r
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)\r
+ != ONIGENC_IS_MBC_WORD(encode, sprev, end))\r
+ goto fail;\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+#ifdef USE_WORD_BEGIN_END\r
+ case OP_WORD_BEGIN: MOP_IN(OP_WORD_BEGIN);\r
+ if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD(encode, s, end)) {\r
+ if (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_WORD(encode, sprev, end)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ }\r
+ goto fail;\r
+ break;\r
+\r
+ case OP_WORD_END: MOP_IN(OP_WORD_END);\r
+ if (!ON_STR_BEGIN(s) && ONIGENC_IS_MBC_WORD(encode, sprev, end)) {\r
+ if (ON_STR_END(s) || !ONIGENC_IS_MBC_WORD(encode, s, end)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ }\r
+ goto fail;\r
+ break;\r
+#endif\r
+\r
+ case OP_BEGIN_BUF: MOP_IN(OP_BEGIN_BUF);\r
+ if (! ON_STR_BEGIN(s)) goto fail;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_END_BUF: MOP_IN(OP_END_BUF);\r
+ if (! ON_STR_END(s)) goto fail;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_BEGIN_LINE: MOP_IN(OP_BEGIN_LINE);\r
+ if (ON_STR_BEGIN(s)) {\r
+ if (IS_NOTBOL(msa->options)) goto fail;\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, sprev, end) && !ON_STR_END(s)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ goto fail;\r
+ break;\r
+\r
+ case OP_END_LINE: MOP_IN(OP_END_LINE);\r
+ if (ON_STR_END(s)) {\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {\r
+#endif\r
+ if (IS_NOTEOL(msa->options)) goto fail;\r
+ MOP_OUT;\r
+ continue;\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ }\r
+#endif\r
+ }\r
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+ else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+#endif\r
+ goto fail;\r
+ break;\r
+\r
+ case OP_SEMI_END_BUF: MOP_IN(OP_SEMI_END_BUF);\r
+ if (ON_STR_END(s)) {\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {\r
+#endif\r
+ if (IS_NOTEOL(msa->options)) goto fail;\r
+ MOP_OUT;\r
+ continue;\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ }\r
+#endif\r
+ }\r
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end) &&\r
+ ON_STR_END(s + enclen(encode, s))) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+ else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {\r
+ UChar* ss = s + enclen(encode, s);\r
+ ss += enclen(encode, ss);\r
+ if (ON_STR_END(ss)) {\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ }\r
+#endif\r
+ goto fail;\r
+ break;\r
+\r
+ case OP_BEGIN_POSITION: MOP_IN(OP_BEGIN_POSITION);\r
+ if (s != msa->start)\r
+ goto fail;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_MEMORY_START_PUSH: MOP_IN(OP_MEMORY_START_PUSH);\r
+ GET_MEMNUM_INC(mem, p);\r
+ STACK_PUSH_MEM_START(mem, s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_MEMORY_START: MOP_IN(OP_MEMORY_START);\r
+ GET_MEMNUM_INC(mem, p);\r
+ mem_start_stk[mem] = (OnigStackIndex )((void* )s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_MEMORY_END_PUSH: MOP_IN(OP_MEMORY_END_PUSH);\r
+ GET_MEMNUM_INC(mem, p);\r
+ STACK_PUSH_MEM_END(mem, s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_MEMORY_END: MOP_IN(OP_MEMORY_END);\r
+ GET_MEMNUM_INC(mem, p);\r
+ mem_end_stk[mem] = (OnigStackIndex )((void* )s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case OP_MEMORY_END_PUSH_REC: MOP_IN(OP_MEMORY_END_PUSH_REC);\r
+ GET_MEMNUM_INC(mem, p);\r
+ STACK_GET_MEM_START(mem, stkp); /* should be before push mem-end. */\r
+ STACK_PUSH_MEM_END(mem, s);\r
+ mem_start_stk[mem] = GET_STACK_INDEX(stkp);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_MEMORY_END_REC: MOP_IN(OP_MEMORY_END_REC);\r
+ GET_MEMNUM_INC(mem, p);\r
+ mem_end_stk[mem] = (OnigStackIndex )((void* )s);\r
+ STACK_GET_MEM_START(mem, stkp);\r
+\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))\r
+ mem_start_stk[mem] = GET_STACK_INDEX(stkp);\r
+ else\r
+ mem_start_stk[mem] = (OnigStackIndex )((void* )stkp->u.mem.pstr);\r
+\r
+ STACK_PUSH_MEM_END_MARK(mem);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif\r
+\r
+ case OP_BACKREF1: MOP_IN(OP_BACKREF1);\r
+ mem = 1;\r
+ goto backref;\r
+ break;\r
+\r
+ case OP_BACKREF2: MOP_IN(OP_BACKREF2);\r
+ mem = 2;\r
+ goto backref;\r
+ break;\r
+\r
+ case OP_BACKREFN: MOP_IN(OP_BACKREFN);\r
+ GET_MEMNUM_INC(mem, p);\r
+ backref:\r
+ {\r
+ int len;\r
+ UChar *pstart, *pend;\r
+\r
+ /* if you want to remove following line, \r
+ you should check in parse and compile time. */\r
+ if (mem > num_mem) goto fail;\r
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;\r
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;\r
+\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))\r
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\r
+ else\r
+ pstart = (UChar* )((void* )mem_start_stk[mem]);\r
+\r
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\r
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[mem]));\r
+ n = (int)(pend - pstart);\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ STRING_CMP(pstart, s, n);\r
+ while (sprev + (len = enclen(encode, sprev)) < s)\r
+ sprev += len;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREFN_IC: MOP_IN(OP_BACKREFN_IC);\r
+ GET_MEMNUM_INC(mem, p);\r
+ {\r
+ int len;\r
+ UChar *pstart, *pend;\r
+\r
+ /* if you want to remove following line, \r
+ you should check in parse and compile time. */\r
+ if (mem > num_mem) goto fail;\r
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;\r
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;\r
+\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))\r
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\r
+ else\r
+ pstart = (UChar* )((void* )mem_start_stk[mem]);\r
+\r
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\r
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[mem]));\r
+ n = (int)(pend - pstart);\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ STRING_CMP_IC(case_fold_flag, pstart, &s, n);\r
+ while (sprev + (len = enclen(encode, sprev)) < s)\r
+ sprev += len;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREF_MULTI: MOP_IN(OP_BACKREF_MULTI);\r
+ {\r
+ int len, is_fail;\r
+ UChar *pstart, *pend, *swork;\r
+\r
+ GET_LENGTH_INC(tlen, p);\r
+ for (i = 0; i < tlen; i++) {\r
+ GET_MEMNUM_INC(mem, p);\r
+\r
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;\r
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;\r
+\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))\r
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\r
+ else\r
+ pstart = (UChar* )((void* )mem_start_stk[mem]);\r
+\r
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\r
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[mem]));\r
+ n = (int)(pend - pstart);\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ swork = s;\r
+ STRING_CMP_VALUE(pstart, swork, n, is_fail);\r
+ if (is_fail) continue;\r
+ s = swork;\r
+ while (sprev + (len = enclen(encode, sprev)) < s)\r
+ sprev += len;\r
+\r
+ p += (SIZE_MEMNUM * (tlen - i - 1));\r
+ break; /* success */\r
+ }\r
+ if (i == tlen) goto fail;\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ break;\r
+\r
+ case OP_BACKREF_MULTI_IC: MOP_IN(OP_BACKREF_MULTI_IC);\r
+ {\r
+ int len, is_fail;\r
+ UChar *pstart, *pend, *swork;\r
+\r
+ GET_LENGTH_INC(tlen, p);\r
+ for (i = 0; i < tlen; i++) {\r
+ GET_MEMNUM_INC(mem, p);\r
+\r
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;\r
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;\r
+\r
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))\r
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\r
+ else\r
+ pstart = (UChar* )((void* )mem_start_stk[mem]);\r
+\r
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\r
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\r
+ : (UChar* )((void* )mem_end_stk[mem]));\r
+ n = (int)(pend - pstart);\r
+ DATA_ENSURE(n);\r
+ sprev = s;\r
+ swork = s;\r
+ STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, is_fail);\r
+ if (is_fail) continue;\r
+ s = swork;\r
+ while (sprev + (len = enclen(encode, sprev)) < s)\r
+ sprev += len;\r
+\r
+ p += (SIZE_MEMNUM * (tlen - i - 1));\r
+ break; /* success */\r
+ }\r
+ if (i == tlen) goto fail;\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ break;\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ case OP_BACKREF_WITH_LEVEL:\r
+ {\r
+ int len;\r
+ OnigOptionType ic;\r
+ LengthType level;\r
+\r
+ GET_OPTION_INC(ic, p);\r
+ GET_LENGTH_INC(level, p);\r
+ GET_LENGTH_INC(tlen, p);\r
+\r
+ sprev = s;\r
+ if (backref_match_at_nested_level(reg, stk, stk_base, ic\r
+ , case_fold_flag, (int )level, (int )tlen, p, &s, end)) {\r
+ while (sprev + (len = enclen(encode, sprev)) < s)\r
+ sprev += len;\r
+\r
+ p += (SIZE_MEMNUM * tlen);\r
+ }\r
+ else\r
+ goto fail;\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ \r
+ break;\r
+#endif\r
+\r
+#if 0 /* no need: IS_DYNAMIC_OPTION() == 0 */\r
+ case OP_SET_OPTION_PUSH: MOP_IN(OP_SET_OPTION_PUSH);\r
+ GET_OPTION_INC(option, p);\r
+ STACK_PUSH_ALT(p, s, sprev);\r
+ p += SIZE_OP_SET_OPTION + SIZE_OP_FAIL;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_SET_OPTION: MOP_IN(OP_SET_OPTION);\r
+ GET_OPTION_INC(option, p);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif\r
+\r
+ case OP_NULL_CHECK_START: MOP_IN(OP_NULL_CHECK_START);\r
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */\r
+ STACK_PUSH_NULL_CHECK_START(mem, s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_NULL_CHECK_END: MOP_IN(OP_NULL_CHECK_END);\r
+ {\r
+ int isnull;\r
+\r
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */\r
+ STACK_NULL_CHECK(isnull, mem, s);\r
+ if (isnull) {\r
+#ifdef ONIG_DEBUG_MATCH\r
+ fprintf(stderr, "NULL_CHECK_END: skip id:%d, s:%d\n",\r
+ (int )mem, (int )s);\r
+#endif\r
+ null_check_found:\r
+ /* empty loop founded, skip next instruction */\r
+ switch (*p++) {\r
+ case OP_JUMP:\r
+ case OP_PUSH:\r
+ p += SIZE_RELADDR;\r
+ break;\r
+ case OP_REPEAT_INC:\r
+ case OP_REPEAT_INC_NG:\r
+ case OP_REPEAT_INC_SG:\r
+ case OP_REPEAT_INC_NG_SG:\r
+ p += SIZE_MEMNUM;\r
+ break;\r
+ default:\r
+ goto unexpected_bytecode_error;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\r
+ case OP_NULL_CHECK_END_MEMST: MOP_IN(OP_NULL_CHECK_END_MEMST);\r
+ {\r
+ int isnull;\r
+\r
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */\r
+ STACK_NULL_CHECK_MEMST(isnull, mem, s, reg);\r
+ if (isnull) {\r
+#ifdef ONIG_DEBUG_MATCH\r
+ fprintf(stderr, "NULL_CHECK_END_MEMST: skip id:%d, s:%d\n",\r
+ (int )mem, (int )s);\r
+#endif\r
+ if (isnull == -1) goto fail;\r
+ goto null_check_found;\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case OP_NULL_CHECK_END_MEMST_PUSH:\r
+ MOP_IN(OP_NULL_CHECK_END_MEMST_PUSH);\r
+ {\r
+ int isnull;\r
+\r
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */\r
+#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\r
+ STACK_NULL_CHECK_MEMST_REC(isnull, mem, s, reg);\r
+#else\r
+ STACK_NULL_CHECK_REC(isnull, mem, s);\r
+#endif\r
+ if (isnull) {\r
+#ifdef ONIG_DEBUG_MATCH\r
+ fprintf(stderr, "NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%d\n",\r
+ (int )mem, (int )s);\r
+#endif\r
+ if (isnull == -1) goto fail;\r
+ goto null_check_found;\r
+ }\r
+ else {\r
+ STACK_PUSH_NULL_CHECK_END(mem);\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif\r
+\r
+ case OP_JUMP: MOP_IN(OP_JUMP);\r
+ GET_RELADDR_INC(addr, p);\r
+ p += addr;\r
+ MOP_OUT;\r
+ CHECK_INTERRUPT_IN_MATCH_AT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_PUSH: MOP_IN(OP_PUSH);\r
+ GET_RELADDR_INC(addr, p);\r
+ STACK_PUSH_ALT(p + addr, s, sprev);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ case OP_STATE_CHECK_PUSH: MOP_IN(OP_STATE_CHECK_PUSH);\r
+ GET_STATE_CHECK_NUM_INC(mem, p);\r
+ STATE_CHECK_VAL(scv, mem);\r
+ if (scv) goto fail;\r
+\r
+ GET_RELADDR_INC(addr, p);\r
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_STATE_CHECK_PUSH_OR_JUMP: MOP_IN(OP_STATE_CHECK_PUSH_OR_JUMP);\r
+ GET_STATE_CHECK_NUM_INC(mem, p);\r
+ GET_RELADDR_INC(addr, p);\r
+ STATE_CHECK_VAL(scv, mem);\r
+ if (scv) {\r
+ p += addr;\r
+ }\r
+ else {\r
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_STATE_CHECK: MOP_IN(OP_STATE_CHECK);\r
+ GET_STATE_CHECK_NUM_INC(mem, p);\r
+ STATE_CHECK_VAL(scv, mem);\r
+ if (scv) goto fail;\r
+\r
+ STACK_PUSH_STATE_CHECK(s, mem);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif /* USE_COMBINATION_EXPLOSION_CHECK */\r
+\r
+ case OP_POP: MOP_IN(OP_POP);\r
+ STACK_POP_ONE;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_PUSH_OR_JUMP_EXACT1: MOP_IN(OP_PUSH_OR_JUMP_EXACT1);\r
+ GET_RELADDR_INC(addr, p);\r
+ if (*p == *s && DATA_ENSURE_CHECK1) {\r
+ p++;\r
+ STACK_PUSH_ALT(p + addr, s, sprev);\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ p += (addr + 1);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_PUSH_IF_PEEK_NEXT: MOP_IN(OP_PUSH_IF_PEEK_NEXT);\r
+ GET_RELADDR_INC(addr, p);\r
+ if (*p == *s) {\r
+ p++;\r
+ STACK_PUSH_ALT(p + addr, s, sprev);\r
+ MOP_OUT;\r
+ continue;\r
+ }\r
+ p++;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_REPEAT: MOP_IN(OP_REPEAT);\r
+ {\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ GET_RELADDR_INC(addr, p);\r
+\r
+ STACK_ENSURE(1);\r
+ repeat_stk[mem] = GET_STACK_INDEX(stk);\r
+ STACK_PUSH_REPEAT(mem, p);\r
+\r
+ if (reg->repeat_range[mem].lower == 0) {\r
+ STACK_PUSH_ALT(p + addr, s, sprev);\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_REPEAT_NG: MOP_IN(OP_REPEAT_NG);\r
+ {\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ GET_RELADDR_INC(addr, p);\r
+\r
+ STACK_ENSURE(1);\r
+ repeat_stk[mem] = GET_STACK_INDEX(stk);\r
+ STACK_PUSH_REPEAT(mem, p);\r
+\r
+ if (reg->repeat_range[mem].lower == 0) {\r
+ STACK_PUSH_ALT(p, s, sprev);\r
+ p += addr;\r
+ }\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_REPEAT_INC: MOP_IN(OP_REPEAT_INC);\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ si = repeat_stk[mem];\r
+ stkp = STACK_AT(si);\r
+\r
+ repeat_inc:\r
+ stkp->u.repeat.count++;\r
+ if (stkp->u.repeat.count >= reg->repeat_range[mem].upper) {\r
+ /* end of repeat. Nothing to do. */\r
+ }\r
+ else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {\r
+ STACK_PUSH_ALT(p, s, sprev);\r
+ p = STACK_AT(si)->u.repeat.pcode; /* Don't use stkp after PUSH. */\r
+ }\r
+ else {\r
+ p = stkp->u.repeat.pcode;\r
+ }\r
+ STACK_PUSH_REPEAT_INC(si);\r
+ MOP_OUT;\r
+ CHECK_INTERRUPT_IN_MATCH_AT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_REPEAT_INC_SG: MOP_IN(OP_REPEAT_INC_SG);\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ STACK_GET_REPEAT(mem, stkp);\r
+ si = GET_STACK_INDEX(stkp);\r
+ goto repeat_inc;\r
+ break;\r
+\r
+ case OP_REPEAT_INC_NG: MOP_IN(OP_REPEAT_INC_NG);\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ si = repeat_stk[mem];\r
+ stkp = STACK_AT(si);\r
+\r
+ repeat_inc_ng:\r
+ stkp->u.repeat.count++;\r
+ if (stkp->u.repeat.count < reg->repeat_range[mem].upper) {\r
+ if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {\r
+ UChar* pcode = stkp->u.repeat.pcode;\r
+\r
+ STACK_PUSH_REPEAT_INC(si);\r
+ STACK_PUSH_ALT(pcode, s, sprev);\r
+ }\r
+ else {\r
+ p = stkp->u.repeat.pcode;\r
+ STACK_PUSH_REPEAT_INC(si);\r
+ }\r
+ }\r
+ else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {\r
+ STACK_PUSH_REPEAT_INC(si);\r
+ }\r
+ MOP_OUT;\r
+ CHECK_INTERRUPT_IN_MATCH_AT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_REPEAT_INC_NG_SG: MOP_IN(OP_REPEAT_INC_NG_SG);\r
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\r
+ STACK_GET_REPEAT(mem, stkp);\r
+ si = GET_STACK_INDEX(stkp);\r
+ goto repeat_inc_ng;\r
+ break;\r
+\r
+ case OP_PUSH_POS: MOP_IN(OP_PUSH_POS);\r
+ STACK_PUSH_POS(s, sprev);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_POP_POS: MOP_IN(OP_POP_POS);\r
+ {\r
+ STACK_POS_END(stkp);\r
+ s = stkp->u.state.pstr;\r
+ sprev = stkp->u.state.pstr_prev;\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_PUSH_POS_NOT: MOP_IN(OP_PUSH_POS_NOT);\r
+ GET_RELADDR_INC(addr, p);\r
+ STACK_PUSH_POS_NOT(p + addr, s, sprev);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_FAIL_POS: MOP_IN(OP_FAIL_POS);\r
+ STACK_POP_TIL_POS_NOT;\r
+ goto fail;\r
+ break;\r
+\r
+ case OP_PUSH_STOP_BT: MOP_IN(OP_PUSH_STOP_BT);\r
+ STACK_PUSH_STOP_BT;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_POP_STOP_BT: MOP_IN(OP_POP_STOP_BT);\r
+ STACK_STOP_BT_END;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_LOOK_BEHIND: MOP_IN(OP_LOOK_BEHIND);\r
+ GET_LENGTH_INC(tlen, p);\r
+ s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);\r
+ if (IS_NULL(s)) goto fail;\r
+ sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_PUSH_LOOK_BEHIND_NOT: MOP_IN(OP_PUSH_LOOK_BEHIND_NOT);\r
+ GET_RELADDR_INC(addr, p);\r
+ GET_LENGTH_INC(tlen, p);\r
+ q = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);\r
+ if (IS_NULL(q)) {\r
+ /* too short case -> success. ex. /(?<!XXX)a/.match("a")\r
+ If you want to change to fail, replace following line. */\r
+ p += addr;\r
+ /* goto fail; */\r
+ }\r
+ else {\r
+ STACK_PUSH_LOOK_BEHIND_NOT(p + addr, s, sprev);\r
+ s = q;\r
+ sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);\r
+ }\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_FAIL_LOOK_BEHIND_NOT: MOP_IN(OP_FAIL_LOOK_BEHIND_NOT);\r
+ STACK_POP_TIL_LOOK_BEHIND_NOT;\r
+ goto fail;\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case OP_CALL: MOP_IN(OP_CALL);\r
+ GET_ABSADDR_INC(addr, p);\r
+ STACK_PUSH_CALL_FRAME(p);\r
+ p = reg->p + addr;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ case OP_RETURN: MOP_IN(OP_RETURN);\r
+ STACK_RETURN(p);\r
+ STACK_PUSH_RETURN;\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+#endif\r
+\r
+ case OP_FINISH:\r
+ goto finish;\r
+ break;\r
+\r
+ fail:\r
+ MOP_OUT;\r
+ /* fall */\r
+ case OP_FAIL: MOP_IN(OP_FAIL);\r
+ STACK_POP;\r
+ p = stk->u.state.pcode;\r
+ s = stk->u.state.pstr;\r
+ sprev = stk->u.state.pstr_prev;\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ if (stk->u.state.state_check != 0) {\r
+ stk->type = STK_STATE_CHECK_MARK;\r
+ stk++;\r
+ }\r
+#endif\r
+\r
+ MOP_OUT;\r
+ continue;\r
+ break;\r
+\r
+ default:\r
+ goto bytecode_error;\r
+\r
+ } /* end of switch */\r
+ sprev = sbegin;\r
+ } /* end of while(1) */\r
+\r
+ finish:\r
+ STACK_SAVE;\r
+ xfree(alloca_base);\r
+ return best_len;\r
+\r
+#ifdef ONIG_DEBUG\r
+ stack_error:\r
+ STACK_SAVE;\r
+ xfree(alloca_base);\r
+ return ONIGERR_STACK_BUG;\r
+#endif\r
+\r
+ bytecode_error:\r
+ STACK_SAVE;\r
+ xfree(alloca_base);\r
+ return ONIGERR_UNDEFINED_BYTECODE;\r
+\r
+ unexpected_bytecode_error:\r
+ STACK_SAVE;\r
+ xfree(alloca_base);\r
+ return ONIGERR_UNEXPECTED_BYTECODE;\r
+}\r
+\r
+\r
+static UChar*\r
+slow_search(OnigEncoding enc, UChar* target, UChar* target_end,\r
+ const UChar* text, const UChar* text_end, UChar* text_range)\r
+{\r
+ UChar *t, *p, *s, *end;\r
+\r
+ end = (UChar* )text_end;\r
+ end -= target_end - target - 1;\r
+ if (end > text_range)\r
+ end = text_range;\r
+\r
+ s = (UChar* )text;\r
+\r
+ while (s < end) {\r
+ if (*s == *target) {\r
+ p = s + 1;\r
+ t = target + 1;\r
+ while (t < target_end) {\r
+ if (*t != *p++)\r
+ break;\r
+ t++;\r
+ }\r
+ if (t == target_end)\r
+ return s;\r
+ }\r
+ s += enclen(enc, s);\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static int\r
+str_lower_case_match(OnigEncoding enc, int case_fold_flag,\r
+ const UChar* t, const UChar* tend,\r
+ const UChar* p, const UChar* end)\r
+{\r
+ int lowlen;\r
+ UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\r
+\r
+ while (t < tend) {\r
+ lowlen = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &p, end, lowbuf);\r
+ q = lowbuf;\r
+ while (lowlen > 0) {\r
+ if (*t++ != *q++) return 0;\r
+ lowlen--;\r
+ }\r
+ }\r
+\r
+ return 1;\r
+}\r
+\r
+static UChar*\r
+slow_search_ic(OnigEncoding enc, int case_fold_flag,\r
+ UChar* target, UChar* target_end,\r
+ const UChar* text, const UChar* text_end, UChar* text_range)\r
+{\r
+ UChar *s, *end;\r
+\r
+ end = (UChar* )text_end;\r
+ end -= target_end - target - 1;\r
+ if (end > text_range)\r
+ end = text_range;\r
+\r
+ s = (UChar* )text;\r
+\r
+ while (s < end) {\r
+ if (str_lower_case_match(enc, case_fold_flag, target, target_end,\r
+ s, text_end))\r
+ return s;\r
+\r
+ s += enclen(enc, s);\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+slow_search_backward(OnigEncoding enc, UChar* target, UChar* target_end,\r
+ const UChar* text, const UChar* adjust_text,\r
+ const UChar* text_end, const UChar* text_start)\r
+{\r
+ UChar *t, *p, *s;\r
+\r
+ s = (UChar* )text_end;\r
+ s -= (target_end - target);\r
+ if (s > text_start)\r
+ s = (UChar* )text_start;\r
+ else\r
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);\r
+\r
+ while (s >= text) {\r
+ if (*s == *target) {\r
+ p = s + 1;\r
+ t = target + 1;\r
+ while (t < target_end) {\r
+ if (*t != *p++)\r
+ break;\r
+ t++;\r
+ }\r
+ if (t == target_end)\r
+ return s;\r
+ }\r
+ s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s);\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+slow_search_backward_ic(OnigEncoding enc, int case_fold_flag,\r
+ UChar* target, UChar* target_end,\r
+ const UChar* text, const UChar* adjust_text,\r
+ const UChar* text_end, const UChar* text_start)\r
+{\r
+ UChar *s;\r
+\r
+ s = (UChar* )text_end;\r
+ s -= (target_end - target);\r
+ if (s > text_start)\r
+ s = (UChar* )text_start;\r
+ else\r
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);\r
+\r
+ while (s >= text) {\r
+ if (str_lower_case_match(enc, case_fold_flag,\r
+ target, target_end, s, text_end))\r
+ return s;\r
+\r
+ s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s);\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+bm_search_notrev(regex_t* reg, const UChar* target, const UChar* target_end,\r
+ const UChar* text, const UChar* text_end,\r
+ const UChar* text_range)\r
+{\r
+ const UChar *s, *se, *t, *p, *end;\r
+ const UChar *tail;\r
+ int skip, tlen1;\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "bm_search_notrev: text: %d, text_end: %d, text_range: %d\n",\r
+ (int )text, (int )text_end, (int )text_range);\r
+#endif\r
+\r
+ tail = target_end - 1;\r
+ tlen1 = (int)(tail - target);\r
+ end = text_range;\r
+ if (end + tlen1 > text_end)\r
+ end = text_end - tlen1;\r
+\r
+ s = text;\r
+\r
+ if (IS_NULL(reg->int_map)) {\r
+ while (s < end) {\r
+ p = se = s + tlen1;\r
+ t = tail;\r
+ while (*p == *t) {\r
+ if (t == target) return (UChar* )s;\r
+ p--; t--;\r
+ }\r
+ skip = reg->map[*se];\r
+ t = s;\r
+ do {\r
+ s += enclen(reg->enc, s);\r
+ } while ((s - t) < skip && s < end);\r
+ }\r
+ }\r
+ else {\r
+ while (s < end) {\r
+ p = se = s + tlen1;\r
+ t = tail;\r
+ while (*p == *t) {\r
+ if (t == target) return (UChar* )s;\r
+ p--; t--;\r
+ }\r
+ skip = reg->int_map[*se];\r
+ t = s;\r
+ do {\r
+ s += enclen(reg->enc, s);\r
+ } while ((s - t) < skip && s < end);\r
+ }\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+bm_search(regex_t* reg, const UChar* target, const UChar* target_end,\r
+ const UChar* text, const UChar* text_end, const UChar* text_range)\r
+{\r
+ const UChar *s, *t, *p, *end;\r
+ const UChar *tail;\r
+\r
+ end = text_range + (target_end - target) - 1;\r
+ if (end > text_end)\r
+ end = text_end;\r
+\r
+ tail = target_end - 1;\r
+ s = text + (target_end - target) - 1;\r
+ if (IS_NULL(reg->int_map)) {\r
+ while (s < end) {\r
+ p = s;\r
+ t = tail;\r
+ while (*p == *t) {\r
+ if (t == target) return (UChar* )p;\r
+ p--; t--;\r
+ }\r
+ s += reg->map[*s];\r
+ }\r
+ }\r
+ else { /* see int_map[] */\r
+ while (s < end) {\r
+ p = s;\r
+ t = tail;\r
+ while (*p == *t) {\r
+ if (t == target) return (UChar* )p;\r
+ p--; t--;\r
+ }\r
+ s += reg->int_map[*s];\r
+ }\r
+ }\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static int\r
+set_bm_backward_skip(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED,\r
+ int** skip)\r
+ \r
+{\r
+ int i, len;\r
+\r
+ if (IS_NULL(*skip)) {\r
+ *skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);\r
+ if (IS_NULL(*skip)) return ONIGERR_MEMORY;\r
+ }\r
+\r
+ len = (int)(end - s);\r
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\r
+ (*skip)[i] = len;\r
+\r
+ for (i = len - 1; i > 0; i--)\r
+ (*skip)[s[i]] = i;\r
+\r
+ return 0;\r
+}\r
+\r
+static UChar*\r
+bm_search_backward(regex_t* reg, const UChar* target, const UChar* target_end,\r
+ const UChar* text, const UChar* adjust_text,\r
+ const UChar* text_end, const UChar* text_start)\r
+{\r
+ const UChar *s, *t, *p;\r
+\r
+ s = text_end - (target_end - target);\r
+ if (text_start < s)\r
+ s = text_start;\r
+ else\r
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);\r
+\r
+ while (s >= text) {\r
+ p = s;\r
+ t = target;\r
+ while (t < target_end && *p == *t) {\r
+ p++; t++;\r
+ }\r
+ if (t == target_end)\r
+ return (UChar* )s;\r
+\r
+ s -= reg->int_map_backward[*s];\r
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);\r
+ }\r
+\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+map_search(OnigEncoding enc, UChar map[],\r
+ const UChar* text, const UChar* text_range)\r
+{\r
+ const UChar *s = text;\r
+\r
+ while (s < text_range) {\r
+ if (map[*s]) return (UChar* )s;\r
+\r
+ s += enclen(enc, s);\r
+ }\r
+ return (UChar* )NULL;\r
+}\r
+\r
+static UChar*\r
+map_search_backward(OnigEncoding enc, UChar map[],\r
+ const UChar* text, const UChar* adjust_text,\r
+ const UChar* text_start)\r
+{\r
+ const UChar *s = text_start;\r
+\r
+ while (s >= text) {\r
+ if (map[*s]) return (UChar* )s;\r
+\r
+ s = onigenc_get_prev_char_head(enc, adjust_text, s);\r
+ }\r
+ return (UChar* )NULL;\r
+}\r
+\r
+extern int\r
+onig_match(regex_t* reg, const UChar* str, const UChar* end, const UChar* at, OnigRegion* region,\r
+ OnigOptionType option)\r
+{\r
+ int r;\r
+ UChar *prev;\r
+ OnigMatchArg msa;\r
+\r
+#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\r
+ start:\r
+ THREAD_ATOMIC_START;\r
+ if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {\r
+ ONIG_STATE_INC(reg);\r
+ if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\r
+ onig_chain_reduce(reg);\r
+ ONIG_STATE_INC(reg);\r
+ }\r
+ }\r
+ else {\r
+ int n;\r
+\r
+ THREAD_ATOMIC_END;\r
+ n = 0;\r
+ while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {\r
+ if (++n > THREAD_PASS_LIMIT_COUNT)\r
+ return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;\r
+ THREAD_PASS;\r
+ }\r
+ goto start;\r
+ }\r
+ THREAD_ATOMIC_END;\r
+#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\r
+\r
+ MATCH_ARG_INIT(msa, option, region, at);\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ {\r
+ int offset = at - str;\r
+ STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);\r
+ }\r
+#endif\r
+\r
+ if (region\r
+#ifdef USE_POSIX_API_REGION_OPTION\r
+ && !IS_POSIX_REGION(option)\r
+#endif\r
+ ) {\r
+ r = onig_region_resize_clear(region, reg->num_mem + 1);\r
+ }\r
+ else\r
+ r = 0;\r
+\r
+ if (r == 0) {\r
+ prev = (UChar* )onigenc_get_prev_char_head(reg->enc, str, at);\r
+ r = match_at(reg, str, end,\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+ end,\r
+#endif\r
+ at, prev, &msa);\r
+ }\r
+\r
+ MATCH_ARG_FREE(msa);\r
+ ONIG_STATE_DEC_THREAD(reg);\r
+ return r;\r
+}\r
+\r
+static int\r
+forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,\r
+ UChar* range, UChar** low, UChar** high, UChar** low_prev)\r
+{\r
+ UChar *p, *pprev = (UChar* )NULL;\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "forward_search_range: str: %d, end: %d, s: %d, range: %d\n",\r
+ (int )str, (int )end, (int )s, (int )range);\r
+#endif\r
+\r
+ p = s;\r
+ if (reg->dmin > 0) {\r
+ if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {\r
+ p += reg->dmin;\r
+ }\r
+ else {\r
+ UChar *q = p + reg->dmin;\r
+ while (p < q) p += enclen(reg->enc, p);\r
+ }\r
+ }\r
+\r
+ retry:\r
+ switch (reg->optimize) {\r
+ case ONIG_OPTIMIZE_EXACT:\r
+ p = slow_search(reg->enc, reg->exact, reg->exact_end, p, end, range);\r
+ break;\r
+ case ONIG_OPTIMIZE_EXACT_IC:\r
+ p = slow_search_ic(reg->enc, reg->case_fold_flag,\r
+ reg->exact, reg->exact_end, p, end, range);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_EXACT_BM:\r
+ p = bm_search(reg, reg->exact, reg->exact_end, p, end, range);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:\r
+ p = bm_search_notrev(reg, reg->exact, reg->exact_end, p, end, range);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_MAP:\r
+ p = map_search(reg->enc, reg->map, p, range);\r
+ break;\r
+ }\r
+\r
+ if (p && p < range) {\r
+ if (p - reg->dmin < s) {\r
+ retry_gate:\r
+ pprev = p;\r
+ p += enclen(reg->enc, p);\r
+ goto retry;\r
+ }\r
+\r
+ if (reg->sub_anchor) {\r
+ UChar* prev;\r
+\r
+ switch (reg->sub_anchor) {\r
+ case ANCHOR_BEGIN_LINE:\r
+ if (!ON_STR_BEGIN(p)) {\r
+ prev = onigenc_get_prev_char_head(reg->enc,\r
+ (pprev ? pprev : str), p);\r
+ if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))\r
+ goto retry_gate;\r
+ }\r
+ break;\r
+\r
+ case ANCHOR_END_LINE:\r
+ if (ON_STR_END(p)) {\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ prev = (UChar* )onigenc_get_prev_char_head(reg->enc,\r
+ (pprev ? pprev : str), p);\r
+ if (prev && ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))\r
+ goto retry_gate;\r
+#endif\r
+ }\r
+ else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+ && ! ONIGENC_IS_MBC_CRNL(reg->enc, p, end)\r
+#endif\r
+ )\r
+ goto retry_gate;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (reg->dmax == 0) {\r
+ *low = p;\r
+ if (low_prev) {\r
+ if (*low > s)\r
+ *low_prev = onigenc_get_prev_char_head(reg->enc, s, p);\r
+ else\r
+ *low_prev = onigenc_get_prev_char_head(reg->enc,\r
+ (pprev ? pprev : str), p);\r
+ }\r
+ }\r
+ else {\r
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {\r
+ *low = p - reg->dmax;\r
+ if (*low > s) {\r
+ *low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s,\r
+ *low, (const UChar** )low_prev);\r
+ if (low_prev && IS_NULL(*low_prev))\r
+ *low_prev = onigenc_get_prev_char_head(reg->enc,\r
+ (pprev ? pprev : s), *low);\r
+ }\r
+ else {\r
+ if (low_prev)\r
+ *low_prev = onigenc_get_prev_char_head(reg->enc,\r
+ (pprev ? pprev : str), *low);\r
+ }\r
+ }\r
+ }\r
+ /* no needs to adjust *high, *high is used as range check only */\r
+ *high = p - reg->dmin;\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr,\r
+ "forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\n",\r
+ (int )(*low - str), (int )(*high - str), reg->dmin, reg->dmax);\r
+#endif\r
+ return 1; /* success */\r
+ }\r
+\r
+ return 0; /* fail */\r
+}\r
+\r
+static int set_bm_backward_skip P_((UChar* s, UChar* end, OnigEncoding enc,\r
+ int** skip));\r
+\r
+#define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD 100\r
+\r
+static int\r
+backward_search_range(regex_t* reg, const UChar* str, const UChar* end,\r
+ UChar* s, const UChar* range, UChar* adjrange,\r
+ UChar** low, UChar** high)\r
+{\r
+ int r;\r
+ UChar *p;\r
+\r
+ range += reg->dmin;\r
+ p = s;\r
+\r
+ retry:\r
+ switch (reg->optimize) {\r
+ case ONIG_OPTIMIZE_EXACT:\r
+ exact_method:\r
+ p = slow_search_backward(reg->enc, reg->exact, reg->exact_end,\r
+ range, adjrange, end, p);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_EXACT_IC:\r
+ p = slow_search_backward_ic(reg->enc, reg->case_fold_flag,\r
+ reg->exact, reg->exact_end,\r
+ range, adjrange, end, p);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_EXACT_BM:\r
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:\r
+ if (IS_NULL(reg->int_map_backward)) {\r
+ if (s - range < BM_BACKWARD_SEARCH_LENGTH_THRESHOLD)\r
+ goto exact_method;\r
+\r
+ r = set_bm_backward_skip(reg->exact, reg->exact_end, reg->enc,\r
+ &(reg->int_map_backward));\r
+ if (r) return r;\r
+ }\r
+ p = bm_search_backward(reg, reg->exact, reg->exact_end, range, adjrange,\r
+ end, p);\r
+ break;\r
+\r
+ case ONIG_OPTIMIZE_MAP:\r
+ p = map_search_backward(reg->enc, reg->map, range, adjrange, p);\r
+ break;\r
+ }\r
+\r
+ if (p) {\r
+ if (reg->sub_anchor) {\r
+ UChar* prev;\r
+\r
+ switch (reg->sub_anchor) {\r
+ case ANCHOR_BEGIN_LINE:\r
+ if (!ON_STR_BEGIN(p)) {\r
+ prev = onigenc_get_prev_char_head(reg->enc, str, p);\r
+ if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {\r
+ p = prev;\r
+ goto retry;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case ANCHOR_END_LINE:\r
+ if (ON_STR_END(p)) {\r
+#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\r
+ prev = onigenc_get_prev_char_head(reg->enc, adjrange, p);\r
+ if (IS_NULL(prev)) goto fail;\r
+ if (ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {\r
+ p = prev;\r
+ goto retry;\r
+ }\r
+#endif\r
+ }\r
+ else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+ && ! ONIGENC_IS_MBC_CRNL(reg->enc, p, end)\r
+#endif\r
+ ) {\r
+ p = onigenc_get_prev_char_head(reg->enc, adjrange, p);\r
+ if (IS_NULL(p)) goto fail;\r
+ goto retry;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ /* no needs to adjust *high, *high is used as range check only */\r
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {\r
+ *low = p - reg->dmax;\r
+ *high = p - reg->dmin;\r
+ *high = onigenc_get_right_adjust_char_head(reg->enc, adjrange, *high);\r
+ }\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "backward_search_range: low: %d, high: %d\n",\r
+ (int )(*low - str), (int )(*high - str));\r
+#endif\r
+ return 1; /* success */\r
+ }\r
+\r
+ fail:\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "backward_search_range: fail.\n");\r
+#endif\r
+ return 0; /* fail */\r
+}\r
+\r
+\r
+extern int\r
+onig_search(regex_t* reg, const UChar* str, const UChar* end,\r
+ const UChar* start, const UChar* range, OnigRegion* region, OnigOptionType option)\r
+{\r
+ int r;\r
+ UChar *s, *prev;\r
+ OnigMatchArg msa;\r
+ const UChar *orig_start = start;\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+ const UChar *orig_range = range;\r
+#endif\r
+\r
+#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\r
+ start:\r
+ THREAD_ATOMIC_START;\r
+ if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {\r
+ ONIG_STATE_INC(reg);\r
+ if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\r
+ onig_chain_reduce(reg);\r
+ ONIG_STATE_INC(reg);\r
+ }\r
+ }\r
+ else {\r
+ int n;\r
+\r
+ THREAD_ATOMIC_END;\r
+ n = 0;\r
+ while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {\r
+ if (++n > THREAD_PASS_LIMIT_COUNT)\r
+ return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;\r
+ THREAD_PASS;\r
+ }\r
+ goto start;\r
+ }\r
+ THREAD_ATOMIC_END;\r
+#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr,\r
+ "onig_search (entry point): str: %d, end: %d, start: %d, range: %d\n",\r
+ (int )str, (int )(end - str), (int )(start - str), (int )(range - str));\r
+#endif\r
+\r
+ if (region\r
+#ifdef USE_POSIX_API_REGION_OPTION\r
+ && !IS_POSIX_REGION(option)\r
+#endif\r
+ ) {\r
+ r = onig_region_resize_clear(region, reg->num_mem + 1);\r
+ if (r) goto finish_no_msa;\r
+ }\r
+\r
+ if (start > end || start < str) goto mismatch_no_msa;\r
+\r
+\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+#define MATCH_AND_RETURN_CHECK(upper_range) \\r
+ r = match_at(reg, str, end, (upper_range), s, prev, &msa); \\r
+ if (r != ONIG_MISMATCH) {\\r
+ if (r >= 0) {\\r
+ if (! IS_FIND_LONGEST(reg->options)) {\\r
+ goto match;\\r
+ }\\r
+ }\\r
+ else goto finish; /* error */ \\r
+ }\r
+#else\r
+#define MATCH_AND_RETURN_CHECK(upper_range) \\r
+ r = match_at(reg, str, end, (upper_range), s, prev, &msa); \\r
+ if (r != ONIG_MISMATCH) {\\r
+ if (r >= 0) {\\r
+ goto match;\\r
+ }\\r
+ else goto finish; /* error */ \\r
+ }\r
+#endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */\r
+#else\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+#define MATCH_AND_RETURN_CHECK(none) \\r
+ r = match_at(reg, str, end, s, prev, &msa);\\r
+ if (r != ONIG_MISMATCH) {\\r
+ if (r >= 0) {\\r
+ if (! IS_FIND_LONGEST(reg->options)) {\\r
+ goto match;\\r
+ }\\r
+ }\\r
+ else goto finish; /* error */ \\r
+ }\r
+#else\r
+#define MATCH_AND_RETURN_CHECK(none) \\r
+ r = match_at(reg, str, end, s, prev, &msa);\\r
+ if (r != ONIG_MISMATCH) {\\r
+ if (r >= 0) {\\r
+ goto match;\\r
+ }\\r
+ else goto finish; /* error */ \\r
+ }\r
+#endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */\r
+#endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */\r
+\r
+\r
+ /* anchor optimize: resume search range */\r
+ if (reg->anchor != 0 && str < end) {\r
+ UChar *min_semi_end, *max_semi_end;\r
+\r
+ if (reg->anchor & ANCHOR_BEGIN_POSITION) {\r
+ /* search start-position only */\r
+ begin_position:\r
+ if (range > start)\r
+ range = start + 1;\r
+ else\r
+ range = start;\r
+ }\r
+ else if (reg->anchor & ANCHOR_BEGIN_BUF) {\r
+ /* search str-position only */\r
+ if (range > start) {\r
+ if (start != str) goto mismatch_no_msa;\r
+ range = str + 1;\r
+ }\r
+ else {\r
+ if (range <= str) {\r
+ start = str;\r
+ range = str;\r
+ }\r
+ else\r
+ goto mismatch_no_msa;\r
+ }\r
+ }\r
+ else if (reg->anchor & ANCHOR_END_BUF) {\r
+ min_semi_end = max_semi_end = (UChar* )end;\r
+\r
+ end_buf:\r
+ if ((OnigDistance )(max_semi_end - str) < reg->anchor_dmin)\r
+ goto mismatch_no_msa;\r
+\r
+ if (range > start) {\r
+ if ((OnigDistance )(min_semi_end - start) > reg->anchor_dmax) {\r
+ start = min_semi_end - reg->anchor_dmax;\r
+ if (start < end)\r
+ start = onigenc_get_right_adjust_char_head(reg->enc, str, start);\r
+ else { /* match with empty at end */\r
+ start = onigenc_get_prev_char_head(reg->enc, str, end);\r
+ }\r
+ }\r
+ if ((OnigDistance )(max_semi_end - (range - 1)) < reg->anchor_dmin) {\r
+ range = max_semi_end - reg->anchor_dmin + 1;\r
+ }\r
+\r
+ if (start >= range) goto mismatch_no_msa;\r
+ }\r
+ else {\r
+ if ((OnigDistance )(min_semi_end - range) > reg->anchor_dmax) {\r
+ range = min_semi_end - reg->anchor_dmax;\r
+ }\r
+ if ((OnigDistance )(max_semi_end - start) < reg->anchor_dmin) {\r
+ start = max_semi_end - reg->anchor_dmin;\r
+ start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, start);\r
+ }\r
+ if (range > start) goto mismatch_no_msa;\r
+ }\r
+ }\r
+ else if (reg->anchor & ANCHOR_SEMI_END_BUF) {\r
+ UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, str, end, 1);\r
+\r
+ max_semi_end = (UChar* )end;\r
+ if (ONIGENC_IS_MBC_NEWLINE(reg->enc, pre_end, end)) {\r
+ min_semi_end = pre_end;\r
+\r
+#ifdef USE_CRNL_AS_LINE_TERMINATOR\r
+ pre_end = ONIGENC_STEP_BACK(reg->enc, str, pre_end, 1);\r
+ if (IS_NOT_NULL(pre_end) &&\r
+ ONIGENC_IS_MBC_CRNL(reg->enc, pre_end, end)) {\r
+ min_semi_end = pre_end;\r
+ }\r
+#endif\r
+ if (min_semi_end > str && start <= min_semi_end) {\r
+ goto end_buf;\r
+ }\r
+ }\r
+ else {\r
+ min_semi_end = (UChar* )end;\r
+ goto end_buf;\r
+ }\r
+ }\r
+ else if ((reg->anchor & ANCHOR_ANYCHAR_STAR_ML)) {\r
+ goto begin_position;\r
+ }\r
+ }\r
+ else if (str == end) { /* empty string */\r
+ static const UChar* address_for_empty_string = (UChar* )"";\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "onig_search: empty string.\n");\r
+#endif\r
+\r
+ if (reg->threshold_len == 0) {\r
+ start = end = str = address_for_empty_string;\r
+ s = (UChar* )start;\r
+ prev = (UChar* )NULL;\r
+\r
+ MATCH_ARG_INIT(msa, option, region, start);\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ msa.state_check_buff = (void* )0;\r
+ msa.state_check_buff_size = 0; /* NO NEED, for valgrind */\r
+#endif\r
+ MATCH_AND_RETURN_CHECK(end);\r
+ goto mismatch;\r
+ }\r
+ goto mismatch_no_msa;\r
+ }\r
+\r
+#ifdef ONIG_DEBUG_SEARCH\r
+ fprintf(stderr, "onig_search(apply anchor): end: %d, start: %d, range: %d\n",\r
+ (int )(end - str), (int )(start - str), (int )(range - str));\r
+#endif\r
+\r
+ MATCH_ARG_INIT(msa, option, region, orig_start);\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ {\r
+ int offset = (MIN(start, range) - str);\r
+ STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);\r
+ }\r
+#endif\r
+\r
+ s = (UChar* )start;\r
+ if (range > start) { /* forward search */\r
+ if (s > str)\r
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);\r
+ else\r
+ prev = (UChar* )NULL;\r
+\r
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {\r
+ UChar *sch_range, *low, *high, *low_prev;\r
+\r
+ sch_range = (UChar* )range;\r
+ if (reg->dmax != 0) {\r
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)\r
+ sch_range = (UChar* )end;\r
+ else {\r
+ sch_range += reg->dmax;\r
+ if (sch_range > end) sch_range = (UChar* )end;\r
+ }\r
+ }\r
+\r
+ if ((end - start) < reg->threshold_len)\r
+ goto mismatch;\r
+\r
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {\r
+ do {\r
+ if (! forward_search_range(reg, str, end, s, sch_range,\r
+ &low, &high, &low_prev)) goto mismatch;\r
+ if (s < low) {\r
+ s = low;\r
+ prev = low_prev;\r
+ }\r
+ while (s <= high) {\r
+ MATCH_AND_RETURN_CHECK(orig_range);\r
+ prev = s;\r
+ s += enclen(reg->enc, s);\r
+ }\r
+ } while (s < range);\r
+ goto mismatch;\r
+ }\r
+ else { /* check only. */\r
+ if (! forward_search_range(reg, str, end, s, sch_range,\r
+ &low, &high, (UChar** )NULL)) goto mismatch;\r
+\r
+ if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) {\r
+ do {\r
+ MATCH_AND_RETURN_CHECK(orig_range);\r
+ prev = s;\r
+ s += enclen(reg->enc, s);\r
+\r
+ while (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end) && s < range) {\r
+ prev = s;\r
+ s += enclen(reg->enc, s);\r
+ }\r
+ } while (s < range);\r
+ goto mismatch;\r
+ }\r
+ }\r
+ }\r
+\r
+ do {\r
+ MATCH_AND_RETURN_CHECK(orig_range);\r
+ prev = s;\r
+ s += enclen(reg->enc, s);\r
+ } while (s < range);\r
+\r
+ if (s == range) { /* because empty match with /$/. */\r
+ MATCH_AND_RETURN_CHECK(orig_range);\r
+ }\r
+ }\r
+ else { /* backward search */\r
+#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\r
+ if (orig_start < end)\r
+ orig_start += enclen(reg->enc, orig_start); /* is upper range */\r
+#endif\r
+\r
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {\r
+ UChar *low, *high, *adjrange, *sch_start;\r
+\r
+ if (range < end)\r
+ adjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, range);\r
+ else\r
+ adjrange = (UChar* )end;\r
+\r
+ if (reg->dmax != ONIG_INFINITE_DISTANCE &&\r
+ (end - range) >= reg->threshold_len) {\r
+ do {\r
+ sch_start = s + reg->dmax;\r
+ if (sch_start > end) sch_start = (UChar* )end;\r
+ if (backward_search_range(reg, str, end, sch_start, range, adjrange,\r
+ &low, &high) <= 0)\r
+ goto mismatch;\r
+\r
+ if (s > high)\r
+ s = high;\r
+\r
+ while (s >= low) {\r
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);\r
+ MATCH_AND_RETURN_CHECK(orig_start);\r
+ s = prev;\r
+ }\r
+ } while (s >= range);\r
+ goto mismatch;\r
+ }\r
+ else { /* check only. */\r
+ if ((end - range) < reg->threshold_len) goto mismatch;\r
+\r
+ sch_start = s;\r
+ if (reg->dmax != 0) {\r
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)\r
+ sch_start = (UChar* )end;\r
+ else {\r
+ sch_start += reg->dmax;\r
+ if (sch_start > end) sch_start = (UChar* )end;\r
+ else\r
+ sch_start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc,\r
+ start, sch_start);\r
+ }\r
+ }\r
+ if (backward_search_range(reg, str, end, sch_start, range, adjrange,\r
+ &low, &high) <= 0) goto mismatch;\r
+ }\r
+ }\r
+\r
+ do {\r
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);\r
+ MATCH_AND_RETURN_CHECK(orig_start);\r
+ s = prev;\r
+ } while (s >= range);\r
+ }\r
+\r
+ mismatch:\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+ if (IS_FIND_LONGEST(reg->options)) {\r
+ if (msa.best_len >= 0) {\r
+ s = msa.best_s;\r
+ goto match;\r
+ }\r
+ }\r
+#endif\r
+ r = ONIG_MISMATCH;\r
+\r
+ finish:\r
+ MATCH_ARG_FREE(msa);\r
+ ONIG_STATE_DEC_THREAD(reg);\r
+\r
+ /* If result is mismatch and no FIND_NOT_EMPTY option,\r
+ then the region is not setted in match_at(). */\r
+ if (IS_FIND_NOT_EMPTY(reg->options) && region\r
+#ifdef USE_POSIX_API_REGION_OPTION\r
+ && !IS_POSIX_REGION(option)\r
+#endif\r
+ ) {\r
+ onig_region_clear(region);\r
+ }\r
+\r
+#ifdef ONIG_DEBUG\r
+ if (r != ONIG_MISMATCH)\r
+ fprintf(stderr, "onig_search: error %d\n", r);\r
+#endif\r
+ return r;\r
+\r
+ mismatch_no_msa:\r
+ r = ONIG_MISMATCH;\r
+ finish_no_msa:\r
+ ONIG_STATE_DEC_THREAD(reg);\r
+#ifdef ONIG_DEBUG\r
+ if (r != ONIG_MISMATCH)\r
+ fprintf(stderr, "onig_search: error %d\n", r);\r
+#endif\r
+ return r;\r
+\r
+ match:\r
+ ONIG_STATE_DEC_THREAD(reg);\r
+ MATCH_ARG_FREE(msa);\r
+ return (int)(s - str);\r
+}\r
+\r
+extern OnigEncoding\r
+onig_get_encoding(regex_t* reg)\r
+{\r
+ return reg->enc;\r
+}\r
+\r
+extern OnigOptionType\r
+onig_get_options(regex_t* reg)\r
+{\r
+ return reg->options;\r
+}\r
+\r
+extern OnigCaseFoldType\r
+onig_get_case_fold_flag(regex_t* reg)\r
+{\r
+ return reg->case_fold_flag;\r
+}\r
+\r
+extern OnigSyntaxType*\r
+onig_get_syntax(regex_t* reg)\r
+{\r
+ return reg->syntax;\r
+}\r
+\r
+extern int\r
+onig_number_of_captures(regex_t* reg)\r
+{\r
+ return reg->num_mem;\r
+}\r
+\r
+extern int\r
+onig_number_of_capture_histories(regex_t* reg)\r
+{\r
+#ifdef USE_CAPTURE_HISTORY\r
+ int i, n;\r
+\r
+ n = 0;\r
+ for (i = 0; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {\r
+ if (BIT_STATUS_AT(reg->capture_history, i) != 0)\r
+ n++;\r
+ }\r
+ return n;\r
+#else\r
+ return 0;\r
+#endif\r
+}\r
+\r
+extern void\r
+onig_copy_encoding(OnigEncoding to, OnigEncoding from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
--- /dev/null
+/**********************************************************************\r
+ reggnu.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+#ifndef ONIGGNU_H\r
+#include "oniggnu.h"\r
+#endif\r
+\r
+extern void\r
+re_free_registers(OnigRegion* r)\r
+{\r
+ /* 0: don't free self */\r
+ onig_region_free(r, 0);\r
+}\r
+\r
+extern int\r
+re_adjust_startpos(regex_t* reg, const char* string, int size,\r
+ int startpos, int range)\r
+{\r
+ if (startpos > 0 && ONIGENC_MBC_MAXLEN(reg->enc) != 1 && startpos < size) {\r
+ UChar *p;\r
+ UChar *s = (UChar* )string + startpos;\r
+\r
+ if (range > 0) {\r
+ p = onigenc_get_right_adjust_char_head(reg->enc, (UChar* )string, s);\r
+ }\r
+ else {\r
+ p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, (UChar* )string, s);\r
+ }\r
+ return (int)(p - (UChar* )string);\r
+ }\r
+\r
+ return startpos;\r
+}\r
+\r
+extern int\r
+re_match(regex_t* reg, const char* str, int size, int pos,\r
+ struct re_registers* regs)\r
+{\r
+ return onig_match(reg, (UChar* )str, (UChar* )(str + size),\r
+ (UChar* )(str + pos), regs, ONIG_OPTION_NONE);\r
+}\r
+\r
+extern int\r
+re_search(regex_t* bufp, const char* string, int size, int startpos, int range,\r
+ struct re_registers* regs)\r
+{\r
+ return onig_search(bufp, (UChar* )string, (UChar* )(string + size),\r
+ (UChar* )(string + startpos),\r
+ (UChar* )(string + startpos + range),\r
+ regs, ONIG_OPTION_NONE);\r
+}\r
+\r
+extern int\r
+re_compile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)\r
+{\r
+ int r;\r
+ OnigErrorInfo einfo;\r
+\r
+ r = onig_compile(reg, (UChar* )pattern, (UChar* )(pattern + size), &einfo);\r
+ if (r != ONIG_NORMAL) {\r
+ if (IS_NOT_NULL(ebuf))\r
+ (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+#ifdef USE_RECOMPILE_API\r
+extern int\r
+re_recompile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)\r
+{\r
+ int r;\r
+ OnigErrorInfo einfo;\r
+ OnigEncoding enc;\r
+\r
+ /* I think encoding and options should be arguments of this function.\r
+ But this is adapted to present re.c. (2002/11/29)\r
+ */\r
+ enc = OnigEncDefaultCharEncoding;\r
+\r
+ r = onig_recompile(reg, (UChar* )pattern, (UChar* )(pattern + size),\r
+ reg->options, enc, OnigDefaultSyntax, &einfo);\r
+ if (r != ONIG_NORMAL) {\r
+ if (IS_NOT_NULL(ebuf))\r
+ (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);\r
+ }\r
+ return r;\r
+}\r
+#endif\r
+\r
+extern void\r
+re_free_pattern(regex_t* reg)\r
+{\r
+ onig_free(reg);\r
+}\r
+\r
+extern int\r
+re_alloc_pattern(regex_t** reg)\r
+{\r
+ *reg = (regex_t* )xmalloc(sizeof(regex_t));\r
+ if (IS_NULL(*reg)) return ONIGERR_MEMORY;\r
+\r
+ return onig_reg_init(*reg, ONIG_OPTION_DEFAULT,\r
+ ONIGENC_CASE_FOLD_DEFAULT,\r
+ OnigEncDefaultCharEncoding,\r
+ OnigDefaultSyntax);\r
+}\r
+\r
+extern void\r
+re_set_casetable(const char* table)\r
+{\r
+ onigenc_set_default_caseconv_table((UChar* )table);\r
+}\r
+\r
+extern void\r
+re_mbcinit(int mb_code)\r
+{\r
+ OnigEncoding enc;\r
+\r
+ switch (mb_code) {\r
+ case RE_MBCTYPE_ASCII:\r
+ enc = ONIG_ENCODING_ASCII;\r
+ break;\r
+ case RE_MBCTYPE_EUC:\r
+ enc = ONIG_ENCODING_EUC_JP;\r
+ break;\r
+ case RE_MBCTYPE_SJIS:\r
+ enc = ONIG_ENCODING_SJIS;\r
+ break;\r
+ case RE_MBCTYPE_UTF8:\r
+ enc = ONIG_ENCODING_UTF8;\r
+ break;\r
+ default:\r
+ return ;\r
+ break;\r
+ }\r
+\r
+ onigenc_set_default_encoding(enc);\r
+}\r
--- /dev/null
+#ifndef REGINT_H\r
+#define REGINT_H\r
+/**********************************************************************\r
+ regint.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2013 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+/* for debug */\r
+/* #define ONIG_DEBUG_PARSE_TREE */\r
+/* #define ONIG_DEBUG_COMPILE */\r
+/* #define ONIG_DEBUG_SEARCH */\r
+/* #define ONIG_DEBUG_MATCH */\r
+/* #define ONIG_DONT_OPTIMIZE */\r
+\r
+/* for byte-code statistical data. */\r
+/* #define ONIG_DEBUG_STATISTICS */\r
+\r
+#if defined(ONIG_DEBUG_PARSE_TREE) || defined(ONIG_DEBUG_MATCH) || \\r
+ defined(ONIG_DEBUG_SEARCH) || defined(ONIG_DEBUG_COMPILE) || \\r
+ defined(ONIG_DEBUG_STATISTICS)\r
+#ifndef ONIG_DEBUG\r
+#define ONIG_DEBUG\r
+#endif\r
+#endif\r
+\r
+#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \\r
+ (defined(__ppc__) && defined(__APPLE__)) || \\r
+ defined(__x86_64) || defined(__x86_64__) || \\r
+ defined(__mc68020__)\r
+#define PLATFORM_UNALIGNED_WORD_ACCESS\r
+#endif\r
+\r
+/* config */\r
+/* spec. config */\r
+#define USE_NAMED_GROUP\r
+#define USE_SUBEXP_CALL\r
+#define USE_BACKREF_WITH_LEVEL /* \k<name+n>, \k<name-n> */\r
+#define USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT /* /(?:()|())*\2/ */\r
+#define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE /* /\n$/ =~ "\n" */\r
+#define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR\r
+/* #define USE_RECOMPILE_API */\r
+/* !!! moved to regenc.h. */ /* #define USE_CRNL_AS_LINE_TERMINATOR */\r
+\r
+/* internal config */\r
+#define USE_PARSE_TREE_NODE_RECYCLE\r
+#define USE_OP_PUSH_OR_JUMP_EXACT\r
+#define USE_QTFR_PEEK_NEXT\r
+#define USE_ST_LIBRARY\r
+#define USE_SHARED_CCLASS_TABLE\r
+\r
+#define INIT_MATCH_STACK_SIZE 160\r
+#define DEFAULT_MATCH_STACK_LIMIT_SIZE 0 /* unlimited */\r
+\r
+#if defined(__GNUC__)\r
+# define ARG_UNUSED __attribute__ ((unused))\r
+#else\r
+# define ARG_UNUSED\r
+#endif\r
+\r
+/* */\r
+/* escape other system UChar definition */\r
+//#include "config.h"\r
+#ifdef ONIG_ESCAPE_UCHAR_COLLISION\r
+#undef ONIG_ESCAPE_UCHAR_COLLISION\r
+#endif\r
+\r
+#define USE_WORD_BEGIN_END /* "\<", "\>" */\r
+#define USE_CAPTURE_HISTORY\r
+#define USE_VARIABLE_META_CHARS\r
+#define USE_POSIX_API_REGION_OPTION\r
+#define USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+/* #define USE_COMBINATION_EXPLOSION_CHECK */ /* (X*)* */\r
+\r
+/* #define USE_MULTI_THREAD_SYSTEM */\r
+#define THREAD_SYSTEM_INIT /* depend on thread system */\r
+#define THREAD_SYSTEM_END /* depend on thread system */\r
+#define THREAD_ATOMIC_START /* depend on thread system */\r
+#define THREAD_ATOMIC_END /* depend on thread system */\r
+#define THREAD_PASS /* depend on thread system */\r
+#define xmalloc malloc\r
+#define xrealloc realloc\r
+#define xcalloc calloc\r
+#define xfree free\r
+\r
+#define CHECK_INTERRUPT_IN_MATCH_AT\r
+\r
+#define st_init_table onig_st_init_table\r
+#define st_init_table_with_size onig_st_init_table_with_size\r
+#define st_init_numtable onig_st_init_numtable\r
+#define st_init_numtable_with_size onig_st_init_numtable_with_size\r
+#define st_init_strtable onig_st_init_strtable\r
+#define st_init_strtable_with_size onig_st_init_strtable_with_size\r
+#define st_delete onig_st_delete\r
+#define st_delete_safe onig_st_delete_safe\r
+#define st_insert onig_st_insert\r
+#define st_lookup onig_st_lookup\r
+#define st_foreach onig_st_foreach\r
+#define st_add_direct onig_st_add_direct\r
+#define st_free_table onig_st_free_table\r
+#define st_cleanup_safe onig_st_cleanup_safe\r
+#define st_copy onig_st_copy\r
+#define st_nothing_key_clone onig_st_nothing_key_clone\r
+#define st_nothing_key_free onig_st_nothing_key_free\r
+/* */\r
+#define onig_st_is_member st_is_member\r
+\r
+#define STATE_CHECK_STRING_THRESHOLD_LEN 7\r
+#define STATE_CHECK_BUFF_MAX_SIZE 0x4000\r
+\r
+#define THREAD_PASS_LIMIT_COUNT 8\r
+//#define xmemset memset\r
+//#define xmemcpy memcpy\r
+//#define xmemmove memmove\r
+\r
+#if defined(_WIN32) && !defined(__GNUC__)\r
+#define xalloca _alloca\r
+#define xvsnprintf _vsnprintf\r
+#else\r
+#define xalloca alloca\r
+#define xvsnprintf vsnprintf\r
+#endif\r
+\r
+\r
+#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\r
+#define ONIG_STATE_INC(reg) (reg)->state++\r
+#define ONIG_STATE_DEC(reg) (reg)->state--\r
+\r
+#define ONIG_STATE_INC_THREAD(reg) do {\\r
+ THREAD_ATOMIC_START;\\r
+ (reg)->state++;\\r
+ THREAD_ATOMIC_END;\\r
+} while(0)\r
+#define ONIG_STATE_DEC_THREAD(reg) do {\\r
+ THREAD_ATOMIC_START;\\r
+ (reg)->state--;\\r
+ THREAD_ATOMIC_END;\\r
+} while(0)\r
+#else\r
+#define ONIG_STATE_INC(reg) /* Nothing */\r
+#define ONIG_STATE_DEC(reg) /* Nothing */\r
+#define ONIG_STATE_INC_THREAD(reg) /* Nothing */\r
+#define ONIG_STATE_DEC_THREAD(reg) /* Nothing */\r
+#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\r
+\r
+#if 0\r
+#ifdef HAVE_STDLIB_H\r
+#include <stdlib.h>\r
+#endif\r
+\r
+#if defined(HAVE_ALLOCA_H) && !defined(__GNUC__)\r
+#include <alloca.h>\r
+#endif\r
+\r
+#ifdef HAVE_STRING_H\r
+# include <string.h>\r
+#else\r
+# include <strings.h>\r
+#endif\r
+\r
+#include <ctype.h>\r
+#ifdef HAVE_SYS_TYPES_H\r
+#ifndef __BORLANDC__\r
+#include <sys/types.h>\r
+#endif\r
+#endif\r
+\r
+#ifdef __BORLANDC__\r
+#include <malloc.h>\r
+#endif\r
+\r
+#ifdef ONIG_DEBUG\r
+# include <stdio.h>\r
+#endif\r
+#endif\r
+\r
+#include "regenc.h"\r
+\r
+#ifdef MIN\r
+#undef MIN\r
+#endif\r
+#ifdef MAX\r
+#undef MAX\r
+#endif\r
+#define MIN(a,b) (((a)>(b))?(b):(a))\r
+#define MAX(a,b) (((a)<(b))?(b):(a))\r
+\r
+#define IS_NULL(p) (((void*)(p)) == (void*)0)\r
+#define IS_NOT_NULL(p) (((void*)(p)) != (void*)0)\r
+#define CHECK_NULL_RETURN(p) if (IS_NULL(p)) return NULL\r
+#define CHECK_NULL_RETURN_MEMERR(p) if (IS_NULL(p)) return ONIGERR_MEMORY\r
+#define NULL_UCHARP ((UChar* )0)\r
+\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+\r
+#define PLATFORM_GET_INC(val,p,type) do{\\r
+ val = *(type* )p;\\r
+ (p) += sizeof(type);\\r
+} while(0)\r
+\r
+#else\r
+\r
+#define PLATFORM_GET_INC(val,p,type) do{\\r
+ xmemcpy(&val, (p), sizeof(type));\\r
+ (p) += sizeof(type);\\r
+} while(0)\r
+\r
+/* sizeof(OnigCodePoint) */\r
+#define WORD_ALIGNMENT_SIZE SIZEOF_LONG\r
+\r
+#define GET_ALIGNMENT_PAD_SIZE(addr,pad_size) do {\\r
+ (pad_size) = WORD_ALIGNMENT_SIZE \\r
+ - ((unsigned int )(addr) % WORD_ALIGNMENT_SIZE);\\r
+ if ((pad_size) == WORD_ALIGNMENT_SIZE) (pad_size) = 0;\\r
+} while (0)\r
+\r
+#define ALIGNMENT_RIGHT(addr) do {\\r
+ (addr) += (WORD_ALIGNMENT_SIZE - 1);\\r
+ (addr) -= ((unsigned int )(addr) % WORD_ALIGNMENT_SIZE);\\r
+} while (0)\r
+\r
+#endif /* PLATFORM_UNALIGNED_WORD_ACCESS */\r
+\r
+/* stack pop level */\r
+#define STACK_POP_LEVEL_FREE 0\r
+#define STACK_POP_LEVEL_MEM_START 1\r
+#define STACK_POP_LEVEL_ALL 2\r
+\r
+/* optimize flags */\r
+#define ONIG_OPTIMIZE_NONE 0\r
+#define ONIG_OPTIMIZE_EXACT 1 /* Slow Search */\r
+#define ONIG_OPTIMIZE_EXACT_BM 2 /* Boyer Moore Search */\r
+#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV 3 /* BM (but not simple match) */\r
+#define ONIG_OPTIMIZE_EXACT_IC 4 /* Slow Search (ignore case) */\r
+#define ONIG_OPTIMIZE_MAP 5 /* char map */\r
+\r
+/* bit status */\r
+typedef unsigned int BitStatusType;\r
+\r
+#define BIT_STATUS_BITS_NUM (sizeof(BitStatusType) * 8)\r
+#define BIT_STATUS_CLEAR(stats) (stats) = 0\r
+#define BIT_STATUS_ON_ALL(stats) (stats) = ~((BitStatusType )0)\r
+#define BIT_STATUS_AT(stats,n) \\r
+ ((n) < (int )BIT_STATUS_BITS_NUM ? ((stats) & (1 << n)) : ((stats) & 1))\r
+\r
+#define BIT_STATUS_ON_AT(stats,n) do {\\r
+ if ((n) < (int )BIT_STATUS_BITS_NUM) \\r
+ (stats) |= (1 << (n));\\r
+ else\\r
+ (stats) |= 1;\\r
+} while (0)\r
+\r
+#define BIT_STATUS_ON_AT_SIMPLE(stats,n) do {\\r
+ if ((n) < (int )BIT_STATUS_BITS_NUM)\\r
+ (stats) |= (1 << (n));\\r
+} while (0)\r
+\r
+\r
+#define INT_MAX_LIMIT ((1UL << (SIZEOF_INT * 8 - 1)) - 1)\r
+\r
+#define DIGITVAL(code) ((code) - '0')\r
+#define ODIGITVAL(code) DIGITVAL(code)\r
+#define XDIGITVAL(enc,code) \\r
+ (ONIGENC_IS_CODE_DIGIT(enc,code) ? DIGITVAL(code) \\r
+ : (ONIGENC_IS_CODE_UPPER(enc,code) ? (code) - 'A' + 10 : (code) - 'a' + 10))\r
+\r
+#define IS_SINGLELINE(option) ((option) & ONIG_OPTION_SINGLELINE)\r
+#define IS_MULTILINE(option) ((option) & ONIG_OPTION_MULTILINE)\r
+#define IS_IGNORECASE(option) ((option) & ONIG_OPTION_IGNORECASE)\r
+#define IS_EXTEND(option) ((option) & ONIG_OPTION_EXTEND)\r
+#define IS_FIND_LONGEST(option) ((option) & ONIG_OPTION_FIND_LONGEST)\r
+#define IS_FIND_NOT_EMPTY(option) ((option) & ONIG_OPTION_FIND_NOT_EMPTY)\r
+#define IS_FIND_CONDITION(option) ((option) & \\r
+ (ONIG_OPTION_FIND_LONGEST | ONIG_OPTION_FIND_NOT_EMPTY))\r
+#define IS_NOTBOL(option) ((option) & ONIG_OPTION_NOTBOL)\r
+#define IS_NOTEOL(option) ((option) & ONIG_OPTION_NOTEOL)\r
+#define IS_POSIX_REGION(option) ((option) & ONIG_OPTION_POSIX_REGION)\r
+\r
+/* OP_SET_OPTION is required for these options.\r
+#define IS_DYNAMIC_OPTION(option) \\r
+ (((option) & (ONIG_OPTION_MULTILINE | ONIG_OPTION_IGNORECASE)) != 0)\r
+*/\r
+/* ignore-case and multibyte status are included in compiled code. */\r
+#define IS_DYNAMIC_OPTION(option) 0\r
+\r
+#define DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag) \\r
+ ((case_fold_flag) & ~INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR)\r
+\r
+#define REPEAT_INFINITE -1\r
+#define IS_REPEAT_INFINITE(n) ((n) == REPEAT_INFINITE)\r
+\r
+/* bitset */\r
+#define BITS_PER_BYTE 8\r
+#define SINGLE_BYTE_SIZE (1 << BITS_PER_BYTE)\r
+#define BITS_IN_ROOM (sizeof(Bits) * BITS_PER_BYTE)\r
+#define BITSET_SIZE (SINGLE_BYTE_SIZE / BITS_IN_ROOM)\r
+\r
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\r
+typedef unsigned int Bits;\r
+#else\r
+typedef unsigned char Bits;\r
+#endif\r
+typedef Bits BitSet[BITSET_SIZE];\r
+typedef Bits* BitSetRef;\r
+\r
+#define SIZE_BITSET sizeof(BitSet)\r
+\r
+#define BITSET_CLEAR(bs) do {\\r
+ int i;\\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { (bs)[i] = 0; } \\r
+} while (0)\r
+\r
+#define BS_ROOM(bs,pos) (bs)[pos / BITS_IN_ROOM]\r
+#define BS_BIT(pos) (1 << (pos % BITS_IN_ROOM))\r
+\r
+#define BITSET_AT(bs, pos) (BS_ROOM(bs,pos) & BS_BIT(pos))\r
+#define BITSET_SET_BIT(bs, pos) BS_ROOM(bs,pos) |= BS_BIT(pos)\r
+#define BITSET_CLEAR_BIT(bs, pos) BS_ROOM(bs,pos) &= ~(BS_BIT(pos))\r
+#define BITSET_INVERT_BIT(bs, pos) BS_ROOM(bs,pos) ^= BS_BIT(pos)\r
+\r
+/* bytes buffer */\r
+typedef struct _BBuf {\r
+ UChar* p;\r
+ unsigned int used;\r
+ unsigned int alloc;\r
+} BBuf;\r
+\r
+#define BBUF_INIT(buf,size) onig_bbuf_init((BBuf* )(buf), (size))\r
+\r
+#define BBUF_SIZE_INC(buf,inc) do{\\r
+ (buf)->alloc += (inc);\\r
+ (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\\r
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\r
+} while (0)\r
+\r
+#define BBUF_EXPAND(buf,low) do{\\r
+ unsigned int OldSize_ = (buf)->alloc * sizeof((buf)->p[0]);\\r
+ do { (buf)->alloc *= 2; } while ((buf)->alloc < (unsigned int )low);\\r
+ (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc, OldSize_);\\r
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\r
+} while (0)\r
+\r
+#define BBUF_ENSURE_SIZE(buf,size) do{\\r
+ unsigned int new_alloc = (buf)->alloc;\\r
+ while (new_alloc < (unsigned int )(size)) { new_alloc *= 2; }\\r
+ if ((buf)->alloc != new_alloc) {\\r
+ (buf)->p = (UChar* )xrealloc((buf)->p, new_alloc, (buf)->alloc);\\r
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\r
+ (buf)->alloc = new_alloc;\\r
+ }\\r
+} while (0)\r
+\r
+#define BBUF_WRITE(buf,pos,bytes,n) do{\\r
+ int used = (pos) + (n);\\r
+ if ((buf)->alloc < (unsigned int )used) BBUF_EXPAND((buf),used);\\r
+ xmemcpy((buf)->p + (pos), (bytes), (n));\\r
+ if ((buf)->used < (unsigned int )used) (buf)->used = used;\\r
+} while (0)\r
+\r
+#define BBUF_WRITE1(buf,pos,byte) do{\\r
+ int used = (pos) + 1;\\r
+ if ((buf)->alloc < (unsigned int )used) BBUF_EXPAND((buf),used);\\r
+ (buf)->p[(pos)] = (byte);\\r
+ if ((buf)->used < (unsigned int )used) (buf)->used = used;\\r
+} while (0)\r
+\r
+#define BBUF_ADD(buf,bytes,n) BBUF_WRITE((buf),(buf)->used,(bytes),(n))\r
+#define BBUF_ADD1(buf,byte) BBUF_WRITE1((buf),(buf)->used,(byte))\r
+#define BBUF_GET_ADD_ADDRESS(buf) ((buf)->p + (buf)->used)\r
+#define BBUF_GET_OFFSET_POS(buf) ((buf)->used)\r
+\r
+/* from < to */\r
+#define BBUF_MOVE_RIGHT(buf,from,to,n) do {\\r
+ if ((unsigned int )((to)+(n)) > (buf)->alloc) BBUF_EXPAND((buf),(to) + (n));\\r
+ xmemmove((buf)->p + (to), (buf)->p + (from), (n));\\r
+ if ((unsigned int )((to)+(n)) > (buf)->used) (buf)->used = (to) + (n);\\r
+} while (0)\r
+\r
+/* from > to */\r
+#define BBUF_MOVE_LEFT(buf,from,to,n) do {\\r
+ xmemmove((buf)->p + (to), (buf)->p + (from), (n));\\r
+} while (0)\r
+\r
+/* from > to */\r
+#define BBUF_MOVE_LEFT_REDUCE(buf,from,to) do {\\r
+ xmemmove((buf)->p + (to), (buf)->p + (from), (buf)->used - (from));\\r
+ (buf)->used -= (from - to);\\r
+} while (0)\r
+\r
+#define BBUF_INSERT(buf,pos,bytes,n) do {\\r
+ if (pos >= (buf)->used) {\\r
+ BBUF_WRITE(buf,pos,bytes,n);\\r
+ }\\r
+ else {\\r
+ BBUF_MOVE_RIGHT((buf),(pos),(pos) + (n),((buf)->used - (pos)));\\r
+ xmemcpy((buf)->p + (pos), (bytes), (n));\\r
+ }\\r
+} while (0)\r
+\r
+#define BBUF_GET_BYTE(buf, pos) (buf)->p[(pos)]\r
+\r
+\r
+#define ANCHOR_BEGIN_BUF (1<<0)\r
+#define ANCHOR_BEGIN_LINE (1<<1)\r
+#define ANCHOR_BEGIN_POSITION (1<<2)\r
+#define ANCHOR_END_BUF (1<<3)\r
+#define ANCHOR_SEMI_END_BUF (1<<4)\r
+#define ANCHOR_END_LINE (1<<5)\r
+\r
+#define ANCHOR_WORD_BOUND (1<<6)\r
+#define ANCHOR_NOT_WORD_BOUND (1<<7)\r
+#define ANCHOR_WORD_BEGIN (1<<8)\r
+#define ANCHOR_WORD_END (1<<9)\r
+#define ANCHOR_PREC_READ (1<<10)\r
+#define ANCHOR_PREC_READ_NOT (1<<11)\r
+#define ANCHOR_LOOK_BEHIND (1<<12)\r
+#define ANCHOR_LOOK_BEHIND_NOT (1<<13)\r
+\r
+#define ANCHOR_ANYCHAR_STAR (1<<14) /* ".*" optimize info */\r
+#define ANCHOR_ANYCHAR_STAR_ML (1<<15) /* ".*" optimize info (multi-line) */\r
+\r
+/* operation code */\r
+enum OpCode {\r
+ OP_FINISH = 0, /* matching process terminator (no more alternative) */\r
+ OP_END = 1, /* pattern code terminator (success end) */\r
+\r
+ OP_EXACT1 = 2, /* single byte, N = 1 */\r
+ OP_EXACT2, /* single byte, N = 2 */\r
+ OP_EXACT3, /* single byte, N = 3 */\r
+ OP_EXACT4, /* single byte, N = 4 */\r
+ OP_EXACT5, /* single byte, N = 5 */\r
+ OP_EXACTN, /* single byte */\r
+ OP_EXACTMB2N1, /* mb-length = 2 N = 1 */\r
+ OP_EXACTMB2N2, /* mb-length = 2 N = 2 */\r
+ OP_EXACTMB2N3, /* mb-length = 2 N = 3 */\r
+ OP_EXACTMB2N, /* mb-length = 2 */\r
+ OP_EXACTMB3N, /* mb-length = 3 */\r
+ OP_EXACTMBN, /* other length */\r
+\r
+ OP_EXACT1_IC, /* single byte, N = 1, ignore case */\r
+ OP_EXACTN_IC, /* single byte, ignore case */\r
+\r
+ OP_CCLASS,\r
+ OP_CCLASS_MB,\r
+ OP_CCLASS_MIX,\r
+ OP_CCLASS_NOT,\r
+ OP_CCLASS_MB_NOT,\r
+ OP_CCLASS_MIX_NOT,\r
+ OP_CCLASS_NODE, /* pointer to CClassNode node */\r
+\r
+ OP_ANYCHAR, /* "." */\r
+ OP_ANYCHAR_ML, /* "." multi-line */\r
+ OP_ANYCHAR_STAR, /* ".*" */\r
+ OP_ANYCHAR_ML_STAR, /* ".*" multi-line */\r
+ OP_ANYCHAR_STAR_PEEK_NEXT,\r
+ OP_ANYCHAR_ML_STAR_PEEK_NEXT,\r
+\r
+ OP_WORD,\r
+ OP_NOT_WORD,\r
+ OP_WORD_BOUND,\r
+ OP_NOT_WORD_BOUND,\r
+ OP_WORD_BEGIN,\r
+ OP_WORD_END,\r
+\r
+ OP_BEGIN_BUF,\r
+ OP_END_BUF,\r
+ OP_BEGIN_LINE,\r
+ OP_END_LINE,\r
+ OP_SEMI_END_BUF,\r
+ OP_BEGIN_POSITION,\r
+\r
+ OP_BACKREF1,\r
+ OP_BACKREF2,\r
+ OP_BACKREFN,\r
+ OP_BACKREFN_IC,\r
+ OP_BACKREF_MULTI,\r
+ OP_BACKREF_MULTI_IC,\r
+ OP_BACKREF_WITH_LEVEL, /* \k<xxx+n>, \k<xxx-n> */\r
+\r
+ OP_MEMORY_START,\r
+ OP_MEMORY_START_PUSH, /* push back-tracker to stack */\r
+ OP_MEMORY_END_PUSH, /* push back-tracker to stack */\r
+ OP_MEMORY_END_PUSH_REC, /* push back-tracker to stack */\r
+ OP_MEMORY_END,\r
+ OP_MEMORY_END_REC, /* push marker to stack */\r
+\r
+ OP_FAIL, /* pop stack and move */\r
+ OP_JUMP,\r
+ OP_PUSH,\r
+ OP_POP,\r
+ OP_PUSH_OR_JUMP_EXACT1, /* if match exact then push, else jump. */\r
+ OP_PUSH_IF_PEEK_NEXT, /* if match exact then push, else none. */\r
+ OP_REPEAT, /* {n,m} */\r
+ OP_REPEAT_NG, /* {n,m}? (non greedy) */\r
+ OP_REPEAT_INC,\r
+ OP_REPEAT_INC_NG, /* non greedy */\r
+ OP_REPEAT_INC_SG, /* search and get in stack */\r
+ OP_REPEAT_INC_NG_SG, /* search and get in stack (non greedy) */\r
+ OP_NULL_CHECK_START, /* null loop checker start */\r
+ OP_NULL_CHECK_END, /* null loop checker end */\r
+ OP_NULL_CHECK_END_MEMST, /* null loop checker end (with capture status) */\r
+ OP_NULL_CHECK_END_MEMST_PUSH, /* with capture status and push check-end */\r
+\r
+ OP_PUSH_POS, /* (?=...) start */\r
+ OP_POP_POS, /* (?=...) end */\r
+ OP_PUSH_POS_NOT, /* (?!...) start */\r
+ OP_FAIL_POS, /* (?!...) end */\r
+ OP_PUSH_STOP_BT, /* (?>...) start */\r
+ OP_POP_STOP_BT, /* (?>...) end */\r
+ OP_LOOK_BEHIND, /* (?<=...) start (no needs end opcode) */\r
+ OP_PUSH_LOOK_BEHIND_NOT, /* (?<!...) start */\r
+ OP_FAIL_LOOK_BEHIND_NOT, /* (?<!...) end */\r
+\r
+ OP_CALL, /* \g<name> */\r
+ OP_RETURN,\r
+\r
+ OP_STATE_CHECK_PUSH, /* combination explosion check and push */\r
+ OP_STATE_CHECK_PUSH_OR_JUMP, /* check ok -> push, else jump */\r
+ OP_STATE_CHECK, /* check only */\r
+ OP_STATE_CHECK_ANYCHAR_STAR,\r
+ OP_STATE_CHECK_ANYCHAR_ML_STAR,\r
+\r
+ /* no need: IS_DYNAMIC_OPTION() == 0 */\r
+ OP_SET_OPTION_PUSH, /* set option and push recover option */\r
+ OP_SET_OPTION /* set option */\r
+};\r
+\r
+typedef int RelAddrType;\r
+typedef int AbsAddrType;\r
+typedef int LengthType;\r
+typedef int RepeatNumType;\r
+typedef short int MemNumType;\r
+typedef short int StateCheckNumType;\r
+typedef void* PointerType;\r
+\r
+#define SIZE_OPCODE 1\r
+#define SIZE_RELADDR sizeof(RelAddrType)\r
+#define SIZE_ABSADDR sizeof(AbsAddrType)\r
+#define SIZE_LENGTH sizeof(LengthType)\r
+#define SIZE_MEMNUM sizeof(MemNumType)\r
+#define SIZE_STATE_CHECK_NUM sizeof(StateCheckNumType)\r
+#define SIZE_REPEATNUM sizeof(RepeatNumType)\r
+#define SIZE_OPTION sizeof(OnigOptionType)\r
+#define SIZE_CODE_POINT sizeof(OnigCodePoint)\r
+#define SIZE_POINTER sizeof(PointerType)\r
+\r
+\r
+#define GET_RELADDR_INC(addr,p) PLATFORM_GET_INC(addr, p, RelAddrType)\r
+#define GET_ABSADDR_INC(addr,p) PLATFORM_GET_INC(addr, p, AbsAddrType)\r
+#define GET_LENGTH_INC(len,p) PLATFORM_GET_INC(len, p, LengthType)\r
+#define GET_MEMNUM_INC(num,p) PLATFORM_GET_INC(num, p, MemNumType)\r
+#define GET_REPEATNUM_INC(num,p) PLATFORM_GET_INC(num, p, RepeatNumType)\r
+#define GET_OPTION_INC(option,p) PLATFORM_GET_INC(option, p, OnigOptionType)\r
+#define GET_POINTER_INC(ptr,p) PLATFORM_GET_INC(ptr, p, PointerType)\r
+#define GET_STATE_CHECK_NUM_INC(num,p) PLATFORM_GET_INC(num, p, StateCheckNumType)\r
+\r
+/* code point's address must be aligned address. */\r
+#define GET_CODE_POINT(code,p) code = *((OnigCodePoint* )(p))\r
+#define GET_BYTE_INC(byte,p) do{\\r
+ byte = *(p);\\r
+ (p)++;\\r
+} while(0)\r
+\r
+\r
+/* op-code + arg size */\r
+#define SIZE_OP_ANYCHAR_STAR SIZE_OPCODE\r
+#define SIZE_OP_ANYCHAR_STAR_PEEK_NEXT (SIZE_OPCODE + 1)\r
+#define SIZE_OP_JUMP (SIZE_OPCODE + SIZE_RELADDR)\r
+#define SIZE_OP_PUSH (SIZE_OPCODE + SIZE_RELADDR)\r
+#define SIZE_OP_POP SIZE_OPCODE\r
+#define SIZE_OP_PUSH_OR_JUMP_EXACT1 (SIZE_OPCODE + SIZE_RELADDR + 1)\r
+#define SIZE_OP_PUSH_IF_PEEK_NEXT (SIZE_OPCODE + SIZE_RELADDR + 1)\r
+#define SIZE_OP_REPEAT_INC (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_REPEAT_INC_NG (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_PUSH_POS SIZE_OPCODE\r
+#define SIZE_OP_PUSH_POS_NOT (SIZE_OPCODE + SIZE_RELADDR)\r
+#define SIZE_OP_POP_POS SIZE_OPCODE\r
+#define SIZE_OP_FAIL_POS SIZE_OPCODE\r
+#define SIZE_OP_SET_OPTION (SIZE_OPCODE + SIZE_OPTION)\r
+#define SIZE_OP_SET_OPTION_PUSH (SIZE_OPCODE + SIZE_OPTION)\r
+#define SIZE_OP_FAIL SIZE_OPCODE\r
+#define SIZE_OP_MEMORY_START (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_MEMORY_START_PUSH (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_MEMORY_END_PUSH (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_MEMORY_END_PUSH_REC (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_MEMORY_END (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_MEMORY_END_REC (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_PUSH_STOP_BT SIZE_OPCODE\r
+#define SIZE_OP_POP_STOP_BT SIZE_OPCODE\r
+#define SIZE_OP_NULL_CHECK_START (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_NULL_CHECK_END (SIZE_OPCODE + SIZE_MEMNUM)\r
+#define SIZE_OP_LOOK_BEHIND (SIZE_OPCODE + SIZE_LENGTH)\r
+#define SIZE_OP_PUSH_LOOK_BEHIND_NOT (SIZE_OPCODE + SIZE_RELADDR + SIZE_LENGTH)\r
+#define SIZE_OP_FAIL_LOOK_BEHIND_NOT SIZE_OPCODE\r
+#define SIZE_OP_CALL (SIZE_OPCODE + SIZE_ABSADDR)\r
+#define SIZE_OP_RETURN SIZE_OPCODE\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+#define SIZE_OP_STATE_CHECK (SIZE_OPCODE + SIZE_STATE_CHECK_NUM)\r
+#define SIZE_OP_STATE_CHECK_PUSH (SIZE_OPCODE + SIZE_STATE_CHECK_NUM + SIZE_RELADDR)\r
+#define SIZE_OP_STATE_CHECK_PUSH_OR_JUMP (SIZE_OPCODE + SIZE_STATE_CHECK_NUM + SIZE_RELADDR)\r
+#define SIZE_OP_STATE_CHECK_ANYCHAR_STAR (SIZE_OPCODE + SIZE_STATE_CHECK_NUM)\r
+#endif\r
+\r
+#define MC_ESC(syn) (syn)->meta_char_table.esc\r
+#define MC_ANYCHAR(syn) (syn)->meta_char_table.anychar\r
+#define MC_ANYTIME(syn) (syn)->meta_char_table.anytime\r
+#define MC_ZERO_OR_ONE_TIME(syn) (syn)->meta_char_table.zero_or_one_time\r
+#define MC_ONE_OR_MORE_TIME(syn) (syn)->meta_char_table.one_or_more_time\r
+#define MC_ANYCHAR_ANYTIME(syn) (syn)->meta_char_table.anychar_anytime\r
+\r
+#define IS_MC_ESC_CODE(code, syn) \\r
+ ((code) == MC_ESC(syn) && \\r
+ !IS_SYNTAX_OP2((syn), ONIG_SYN_OP2_INEFFECTIVE_ESCAPE))\r
+\r
+\r
+#define SYN_POSIX_COMMON_OP \\r
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_POSIX_BRACKET | \\r
+ ONIG_SYN_OP_DECIMAL_BACKREF | \\r
+ ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_ASTERISK_ZERO_INF | \\r
+ ONIG_SYN_OP_LINE_ANCHOR | \\r
+ ONIG_SYN_OP_ESC_CONTROL_CHARS )\r
+\r
+#define SYN_GNU_REGEX_OP \\r
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | \\r
+ ONIG_SYN_OP_POSIX_BRACKET | ONIG_SYN_OP_DECIMAL_BACKREF | \\r
+ ONIG_SYN_OP_BRACE_INTERVAL | ONIG_SYN_OP_LPAREN_SUBEXP | \\r
+ ONIG_SYN_OP_VBAR_ALT | \\r
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF | \\r
+ ONIG_SYN_OP_QMARK_ZERO_ONE | \\r
+ ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR | ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR | \\r
+ ONIG_SYN_OP_ESC_W_WORD | \\r
+ ONIG_SYN_OP_ESC_B_WORD_BOUND | ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | \\r
+ ONIG_SYN_OP_ESC_S_WHITE_SPACE | ONIG_SYN_OP_ESC_D_DIGIT | \\r
+ ONIG_SYN_OP_LINE_ANCHOR )\r
+\r
+#define SYN_GNU_REGEX_BV \\r
+ ( ONIG_SYN_CONTEXT_INDEP_ANCHORS | ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | \\r
+ ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS | ONIG_SYN_ALLOW_INVALID_INTERVAL | \\r
+ ONIG_SYN_BACKSLASH_ESCAPE_IN_CC | ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )\r
+\r
+\r
+#define NCCLASS_FLAGS(cc) ((cc)->flags)\r
+#define NCCLASS_FLAG_SET(cc,flag) (NCCLASS_FLAGS(cc) |= (flag))\r
+#define NCCLASS_FLAG_CLEAR(cc,flag) (NCCLASS_FLAGS(cc) &= ~(flag))\r
+#define IS_NCCLASS_FLAG_ON(cc,flag) ((NCCLASS_FLAGS(cc) & (flag)) != 0)\r
+\r
+/* cclass node */\r
+#define FLAG_NCCLASS_NOT (1<<0)\r
+#define FLAG_NCCLASS_SHARE (1<<1)\r
+\r
+#define NCCLASS_SET_NOT(nd) NCCLASS_FLAG_SET(nd, FLAG_NCCLASS_NOT)\r
+#define NCCLASS_SET_SHARE(nd) NCCLASS_FLAG_SET(nd, FLAG_NCCLASS_SHARE)\r
+#define NCCLASS_CLEAR_NOT(nd) NCCLASS_FLAG_CLEAR(nd, FLAG_NCCLASS_NOT)\r
+#define IS_NCCLASS_NOT(nd) IS_NCCLASS_FLAG_ON(nd, FLAG_NCCLASS_NOT)\r
+#define IS_NCCLASS_SHARE(nd) IS_NCCLASS_FLAG_ON(nd, FLAG_NCCLASS_SHARE)\r
+\r
+typedef struct {\r
+ int type;\r
+ /* struct _Node* next; */\r
+ /* unsigned int flags; */\r
+} NodeBase;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ unsigned int flags;\r
+ BitSet bs;\r
+ BBuf* mbuf; /* multi-byte info or NULL */\r
+} CClassNode;\r
+\r
+typedef long OnigStackIndex;\r
+\r
+typedef struct _OnigStackType {\r
+ unsigned int type;\r
+ union {\r
+ struct {\r
+ UChar *pcode; /* byte code position */\r
+ UChar *pstr; /* string position */\r
+ UChar *pstr_prev; /* previous char position of pstr */\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ unsigned int state_check;\r
+#endif\r
+ } state;\r
+ struct {\r
+ int count; /* for OP_REPEAT_INC, OP_REPEAT_INC_NG */\r
+ UChar *pcode; /* byte code position (head of repeated target) */\r
+ int num; /* repeat id */\r
+ } repeat;\r
+ struct {\r
+ OnigStackIndex si; /* index of stack */\r
+ } repeat_inc;\r
+ struct {\r
+ int num; /* memory num */\r
+ UChar *pstr; /* start/end position */\r
+ /* Following information is setted, if this stack type is MEM-START */\r
+ OnigStackIndex start; /* prev. info (for backtrack "(...)*" ) */\r
+ OnigStackIndex end; /* prev. info (for backtrack "(...)*" ) */\r
+ } mem;\r
+ struct {\r
+ int num; /* null check id */\r
+ UChar *pstr; /* start position */\r
+ } null_check;\r
+#ifdef USE_SUBEXP_CALL\r
+ struct {\r
+ UChar *ret_addr; /* byte code position */\r
+ int num; /* null check id */\r
+ UChar *pstr; /* string position */\r
+ } call_frame;\r
+#endif\r
+ } u;\r
+} OnigStackType;\r
+\r
+typedef struct {\r
+ void* stack_p;\r
+ int stack_n;\r
+ OnigOptionType options;\r
+ OnigRegion* region;\r
+ const UChar* start; /* search start position (for \G: BEGIN_POSITION) */\r
+#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\r
+ int best_len; /* for ONIG_OPTION_FIND_LONGEST */\r
+ UChar* best_s;\r
+#endif\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ void* state_check_buff;\r
+ int state_check_buff_size;\r
+#endif\r
+} OnigMatchArg;\r
+\r
+\r
+#define IS_CODE_SB_WORD(enc,code) \\r
+ (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_WORD(enc,code))\r
+\r
+typedef struct OnigEndCallListItem {\r
+ struct OnigEndCallListItem* next;\r
+ void (*func)(void);\r
+} OnigEndCallListItemType;\r
+\r
+extern void onig_add_end_call(void (*func)(void));\r
+\r
+\r
+#ifdef ONIG_DEBUG\r
+\r
+typedef struct {\r
+ short int opcode;\r
+ char* name;\r
+ short int arg_type;\r
+} OnigOpInfoType;\r
+\r
+extern OnigOpInfoType OnigOpInfo[];\r
+\r
+\r
+extern void onig_print_compiled_byte_code P_((FILE* f, UChar* bp, UChar** nextp, OnigEncoding enc));\r
+\r
+#ifdef ONIG_DEBUG_STATISTICS\r
+extern void onig_statistics_init P_((void));\r
+extern void onig_print_statistics P_((FILE* f));\r
+#endif\r
+#endif\r
+\r
+extern UChar* onig_error_code_to_format P_((int code));\r
+extern void onig_snprintf_with_pattern PV_((UChar buf[], int bufsize, OnigEncoding enc, UChar* pat, UChar* pat_end, const UChar *fmt, ...));\r
+extern int onig_bbuf_init P_((BBuf* buf, int size));\r
+extern int onig_compile P_((regex_t* reg, const UChar* pattern, const UChar* pattern_end, OnigErrorInfo* einfo));\r
+extern void onig_chain_reduce P_((regex_t* reg));\r
+extern void onig_chain_link_add P_((regex_t* to, regex_t* add));\r
+extern void onig_transfer P_((regex_t* to, regex_t* from));\r
+extern int onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc));\r
+extern int onig_is_code_in_cc_len P_((int enclen, OnigCodePoint code, CClassNode* cc));\r
+\r
+/* strend hash */\r
+typedef void hash_table_type;\r
+typedef unsigned long hash_data_type;\r
+\r
+extern hash_table_type* onig_st_init_strend_table_with_size P_((int size));\r
+extern int onig_st_lookup_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type *value));\r
+extern int onig_st_insert_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type value));\r
+\r
+/* encoding property management */\r
+#define PROPERTY_LIST_ADD_PROP(Name, CR) \\r
+ r = onigenc_property_list_add_property((UChar* )Name, CR,\\r
+ &PropertyNameTable, &PropertyList, &PropertyListNum,\\r
+ &PropertyListSize);\\r
+ if (r != 0) goto end\r
+\r
+#define PROPERTY_LIST_INIT_CHECK \\r
+ if (PropertyInited == 0) {\\r
+ int r = onigenc_property_list_init(init_property_list);\\r
+ if (r != 0) return r;\\r
+ }\r
+\r
+extern int onigenc_property_list_add_property P_((UChar* name, const OnigCodePoint* prop, hash_table_type **table, const OnigCodePoint*** plist, int *pnum, int *psize));\r
+\r
+typedef int (*ONIGENC_INIT_PROPERTY_LIST_FUNC_TYPE)(void);\r
+\r
+extern int onigenc_property_list_init P_((ONIGENC_INIT_PROPERTY_LIST_FUNC_TYPE));\r
+\r
+#endif /* REGINT_H */\r
--- /dev/null
+/**********************************************************************\r
+ regparse.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regparse.h"\r
+#include "st.h"\r
+\r
+#define WARN_BUFSIZE 256\r
+\r
+#define CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\r
+\r
+\r
+OnigSyntaxType OnigSyntaxRuby = {\r
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\r
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\r
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\r
+ ONIG_SYN_OP_ESC_C_CONTROL )\r
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\r
+ , ( ONIG_SYN_OP2_QMARK_GROUP_EFFECT |\r
+ ONIG_SYN_OP2_OPTION_RUBY |\r
+ ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP | ONIG_SYN_OP2_ESC_K_NAMED_BACKREF |\r
+ ONIG_SYN_OP2_ESC_G_SUBEXP_CALL |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\r
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\r
+ ONIG_SYN_OP2_CCLASS_SET_OP | ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL |\r
+ ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META | ONIG_SYN_OP2_ESC_V_VTAB |\r
+ ONIG_SYN_OP2_ESC_H_XDIGIT )\r
+ , ( SYN_GNU_REGEX_BV | \r
+ ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV |\r
+ ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND |\r
+ ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP |\r
+ ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME |\r
+ ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY |\r
+ ONIG_SYN_WARN_CC_OP_NOT_ESCAPED |\r
+ ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT )\r
+ , ONIG_OPTION_NONE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType* OnigDefaultSyntax = ONIG_SYNTAX_RUBY;\r
+\r
+extern void onig_null_warn(const char* s ARG_UNUSED) { }\r
+\r
+#ifdef DEFAULT_WARN_FUNCTION\r
+static OnigWarnFunc onig_warn = (OnigWarnFunc )DEFAULT_WARN_FUNCTION;\r
+#else\r
+static OnigWarnFunc onig_warn = onig_null_warn;\r
+#endif\r
+\r
+#ifdef DEFAULT_VERB_WARN_FUNCTION\r
+static OnigWarnFunc onig_verb_warn = (OnigWarnFunc )DEFAULT_VERB_WARN_FUNCTION;\r
+#else\r
+static OnigWarnFunc onig_verb_warn = onig_null_warn;\r
+#endif\r
+\r
+extern void onig_set_warn_func(OnigWarnFunc f)\r
+{\r
+ onig_warn = f;\r
+}\r
+\r
+extern void onig_set_verb_warn_func(OnigWarnFunc f)\r
+{\r
+ onig_verb_warn = f;\r
+}\r
+\r
+static void\r
+bbuf_free(BBuf* bbuf)\r
+{\r
+ if (IS_NOT_NULL(bbuf)) {\r
+ if (IS_NOT_NULL(bbuf->p)) xfree(bbuf->p);\r
+ xfree(bbuf);\r
+ }\r
+}\r
+\r
+static int\r
+bbuf_clone(BBuf** rto, BBuf* from)\r
+{\r
+ int r;\r
+ BBuf *to;\r
+\r
+ *rto = to = (BBuf* )xmalloc(sizeof(BBuf));\r
+ CHECK_NULL_RETURN_MEMERR(to);\r
+ r = BBUF_INIT(to, from->alloc);\r
+ if (r != 0) return r;\r
+ to->used = from->used;\r
+ xmemcpy(to->p, from->p, from->used);\r
+ return 0;\r
+}\r
+\r
+#define BACKREF_REL_TO_ABS(rel_no, env) \\r
+ ((env)->num_mem + 1 + (rel_no))\r
+\r
+#define ONOFF(v,f,negative) (negative) ? ((v) &= ~(f)) : ((v) |= (f))\r
+\r
+#define MBCODE_START_POS(enc) \\r
+ (OnigCodePoint )(ONIGENC_MBC_MINLEN(enc) > 1 ? 0 : 0x80)\r
+\r
+#define SET_ALL_MULTI_BYTE_RANGE(enc, pbuf) \\r
+ add_code_range_to_buf(pbuf, MBCODE_START_POS(enc), ~((OnigCodePoint )0))\r
+\r
+#define ADD_ALL_MULTI_BYTE_RANGE(enc, mbuf) do {\\r
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {\\r
+ r = SET_ALL_MULTI_BYTE_RANGE(enc, &(mbuf));\\r
+ if (r) return r;\\r
+ }\\r
+} while (0)\r
+\r
+\r
+#define BITSET_IS_EMPTY(bs,empty) do {\\r
+ int i;\\r
+ empty = 1;\\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) {\\r
+ if ((bs)[i] != 0) {\\r
+ empty = 0; break;\\r
+ }\\r
+ }\\r
+} while (0)\r
+\r
+static void\r
+bitset_set_range(BitSetRef bs, int from, int to)\r
+{\r
+ int i;\r
+ for (i = from; i <= to && i < SINGLE_BYTE_SIZE; i++) {\r
+ BITSET_SET_BIT(bs, i);\r
+ }\r
+}\r
+\r
+#if 0\r
+static void\r
+bitset_set_all(BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < BITSET_SIZE; i++) { bs[i] = ~((Bits )0); }\r
+}\r
+#endif\r
+\r
+static void\r
+bitset_invert(BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { bs[i] = ~(bs[i]); }\r
+}\r
+\r
+static void\r
+bitset_invert_to(BitSetRef from, BitSetRef to)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { to[i] = ~(from[i]); }\r
+}\r
+\r
+static void\r
+bitset_and(BitSetRef dest, BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { dest[i] &= bs[i]; }\r
+}\r
+\r
+static void\r
+bitset_or(BitSetRef dest, BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { dest[i] |= bs[i]; }\r
+}\r
+\r
+static void\r
+bitset_copy(BitSetRef dest, BitSetRef bs)\r
+{\r
+ int i;\r
+ for (i = 0; i < (int )BITSET_SIZE; i++) { dest[i] = bs[i]; }\r
+}\r
+\r
+extern int\r
+onig_strncmp(const UChar* s1, const UChar* s2, int n)\r
+{\r
+ int x;\r
+\r
+ while (n-- > 0) {\r
+ x = *s2++ - *s1++;\r
+ if (x) return x;\r
+ }\r
+ return 0;\r
+}\r
+\r
+extern void\r
+onig_strcpy(UChar* dest, const UChar* src, const UChar* end)\r
+{\r
+ int len = (int)(end - src);\r
+ if (len > 0) {\r
+ xmemcpy(dest, src, len);\r
+ dest[len] = (UChar )0;\r
+ }\r
+}\r
+\r
+#ifdef USE_NAMED_GROUP\r
+static UChar*\r
+strdup_with_null(OnigEncoding enc, UChar* s, UChar* end)\r
+{\r
+ int slen, term_len, i;\r
+ UChar *r;\r
+\r
+ slen = (int)(end - s);\r
+ term_len = ONIGENC_MBC_MINLEN(enc);\r
+\r
+ r = (UChar* )xmalloc(slen + term_len);\r
+ CHECK_NULL_RETURN(r);\r
+ xmemcpy(r, s, slen);\r
+\r
+ for (i = 0; i < term_len; i++)\r
+ r[slen + i] = (UChar )0;\r
+\r
+ return r;\r
+}\r
+#endif\r
+\r
+/* scan pattern methods */\r
+#define PEND_VALUE 0\r
+\r
+#define PFETCH_READY UChar* pfetch_prev\r
+#define PEND (p < end ? 0 : 1)\r
+#define PUNFETCH p = pfetch_prev\r
+#define PINC do { \\r
+ pfetch_prev = p; \\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p); \\r
+} while (0)\r
+#define PFETCH(c) do { \\r
+ c = ONIGENC_MBC_TO_CODE(enc, p, end); \\r
+ pfetch_prev = p; \\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p); \\r
+} while (0)\r
+\r
+#define PINC_S do { \\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p); \\r
+} while (0)\r
+#define PFETCH_S(c) do { \\r
+ c = ONIGENC_MBC_TO_CODE(enc, p, end); \\r
+ p += ONIGENC_MBC_ENC_LEN(enc, p); \\r
+} while (0)\r
+\r
+#define PPEEK (p < end ? ONIGENC_MBC_TO_CODE(enc, p, end) : PEND_VALUE)\r
+#define PPEEK_IS(c) (PPEEK == (OnigCodePoint )c)\r
+\r
+static UChar*\r
+strcat_capa(UChar* dest, UChar* dest_end, const UChar* src, const UChar* src_end,\r
+ int capa, int oldCapa)\r
+{\r
+ UChar* r;\r
+\r
+ if (dest)\r
+ r = (UChar* )xrealloc(dest, capa + 1, oldCapa);\r
+ else\r
+ r = (UChar* )xmalloc(capa + 1);\r
+\r
+ CHECK_NULL_RETURN(r);\r
+ onig_strcpy(r + (dest_end - dest), src, src_end);\r
+ return r;\r
+}\r
+\r
+/* dest on static area */\r
+static UChar*\r
+strcat_capa_from_static(UChar* dest, UChar* dest_end,\r
+ const UChar* src, const UChar* src_end, int capa)\r
+{\r
+ UChar* r;\r
+\r
+ r = (UChar* )xmalloc(capa + 1);\r
+ CHECK_NULL_RETURN(r);\r
+ onig_strcpy(r, dest, dest_end);\r
+ onig_strcpy(r + (dest_end - dest), src, src_end);\r
+ return r;\r
+}\r
+\r
+\r
+#ifdef USE_ST_LIBRARY\r
+\r
+typedef struct {\r
+ UChar* s;\r
+ UChar* end;\r
+} st_str_end_key;\r
+\r
+static int\r
+str_end_cmp(st_str_end_key* x, st_str_end_key* y)\r
+{\r
+ UChar *p, *q;\r
+ int c;\r
+\r
+ if ((x->end - x->s) != (y->end - y->s))\r
+ return 1;\r
+\r
+ p = x->s;\r
+ q = y->s;\r
+ while (p < x->end) {\r
+ c = (int )*p - (int )*q;\r
+ if (c != 0) return c;\r
+\r
+ p++; q++;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+str_end_hash(st_str_end_key* x)\r
+{\r
+ UChar *p;\r
+ int val = 0;\r
+\r
+ p = x->s;\r
+ while (p < x->end) {\r
+ val = val * 997 + (int )*p++;\r
+ }\r
+\r
+ return val + (val >> 5);\r
+}\r
+\r
+extern hash_table_type*\r
+onig_st_init_strend_table_with_size(int size)\r
+{\r
+ static struct st_hash_type hashType = {\r
+ str_end_cmp,\r
+ str_end_hash,\r
+ };\r
+\r
+ return (hash_table_type* )\r
+ onig_st_init_table_with_size(&hashType, size);\r
+}\r
+\r
+extern int\r
+onig_st_lookup_strend(hash_table_type* table, const UChar* str_key,\r
+ const UChar* end_key, hash_data_type *value)\r
+{\r
+ st_str_end_key key;\r
+\r
+ key.s = (UChar* )str_key;\r
+ key.end = (UChar* )end_key;\r
+\r
+ return onig_st_lookup(table, (st_data_t )(&key), value);\r
+}\r
+\r
+extern int\r
+onig_st_insert_strend(hash_table_type* table, const UChar* str_key,\r
+ const UChar* end_key, hash_data_type value)\r
+{\r
+ st_str_end_key* key;\r
+ int result;\r
+\r
+ key = (st_str_end_key* )xmalloc(sizeof(st_str_end_key));\r
+ key->s = (UChar* )str_key;\r
+ key->end = (UChar* )end_key;\r
+ result = onig_st_insert(table, (st_data_t )key, value);\r
+ if (result) {\r
+ xfree(key);\r
+ }\r
+ return result;\r
+}\r
+\r
+#endif /* USE_ST_LIBRARY */\r
+\r
+\r
+#ifdef USE_NAMED_GROUP\r
+\r
+#define INIT_NAME_BACKREFS_ALLOC_NUM 8\r
+\r
+typedef struct {\r
+ UChar* name;\r
+ int name_len; /* byte length */\r
+ int back_num; /* number of backrefs */\r
+ int back_alloc;\r
+ int back_ref1;\r
+ int* back_refs;\r
+} NameEntry;\r
+\r
+#ifdef USE_ST_LIBRARY\r
+\r
+typedef st_table NameTable;\r
+typedef st_data_t HashDataType; /* 1.6 st.h doesn't define st_data_t type */\r
+\r
+#define NAMEBUF_SIZE 24\r
+#define NAMEBUF_SIZE_1 25\r
+\r
+#ifdef ONIG_DEBUG\r
+static int\r
+i_print_name_entry(UChar* key, NameEntry* e, void* arg)\r
+{\r
+ int i;\r
+ FILE* fp = (FILE* )arg;\r
+\r
+ fprintf(fp, "%s: ", e->name);\r
+ if (e->back_num == 0)\r
+ fputs("-", fp);\r
+ else if (e->back_num == 1)\r
+ fprintf(fp, "%d", e->back_ref1);\r
+ else {\r
+ for (i = 0; i < e->back_num; i++) {\r
+ if (i > 0) fprintf(fp, ", ");\r
+ fprintf(fp, "%d", e->back_refs[i]);\r
+ }\r
+ }\r
+ fputs("\n", fp);\r
+ return ST_CONTINUE;\r
+}\r
+\r
+extern int\r
+onig_print_names(FILE* fp, regex_t* reg)\r
+{\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ fprintf(fp, "name table\n");\r
+ onig_st_foreach(t, i_print_name_entry, (HashDataType )fp);\r
+ fputs("\n", fp);\r
+ }\r
+ return 0;\r
+}\r
+#endif /* ONIG_DEBUG */\r
+\r
+static int\r
+i_free_name_entry(UChar* key, NameEntry* e, void* arg ARG_UNUSED)\r
+{\r
+ xfree(e->name);\r
+ if (IS_NOT_NULL(e->back_refs)) xfree(e->back_refs);\r
+ xfree(key);\r
+ xfree(e);\r
+ return ST_DELETE;\r
+}\r
+\r
+static int\r
+names_clear(regex_t* reg)\r
+{\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ onig_st_foreach(t, i_free_name_entry, 0);\r
+ }\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_names_free(regex_t* reg)\r
+{\r
+ int r;\r
+ NameTable* t;\r
+\r
+ r = names_clear(reg);\r
+ if (r) return r;\r
+\r
+ t = (NameTable* )reg->name_table;\r
+ if (IS_NOT_NULL(t)) onig_st_free_table(t);\r
+ reg->name_table = (void* )NULL;\r
+ return 0;\r
+}\r
+\r
+static NameEntry*\r
+name_find(regex_t* reg, const UChar* name, const UChar* name_end)\r
+{\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ e = (NameEntry* )NULL;\r
+ if (IS_NOT_NULL(t)) {\r
+ onig_st_lookup_strend(t, name, name_end, (HashDataType* )((void* )(&e)));\r
+ }\r
+ return e;\r
+}\r
+\r
+typedef struct {\r
+ int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*);\r
+ regex_t* reg;\r
+ void* arg;\r
+ int ret;\r
+ OnigEncoding enc;\r
+} INamesArg;\r
+\r
+static int\r
+i_names(UChar* key ARG_UNUSED, NameEntry* e, INamesArg* arg)\r
+{\r
+ int r = (*(arg->func))(e->name,\r
+ e->name + e->name_len,\r
+ e->back_num,\r
+ (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),\r
+ arg->reg, arg->arg);\r
+ if (r != 0) {\r
+ arg->ret = r;\r
+ return ST_STOP;\r
+ }\r
+ return ST_CONTINUE;\r
+}\r
+\r
+extern int\r
+onig_foreach_name(regex_t* reg,\r
+ int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\r
+{\r
+ INamesArg narg;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ narg.ret = 0;\r
+ if (IS_NOT_NULL(t)) {\r
+ narg.func = func;\r
+ narg.reg = reg;\r
+ narg.arg = arg;\r
+ narg.enc = reg->enc; /* should be pattern encoding. */\r
+ onig_st_foreach(t, i_names, (HashDataType )&narg);\r
+ }\r
+ return narg.ret;\r
+}\r
+\r
+static int\r
+i_renumber_name(UChar* key ARG_UNUSED, NameEntry* e, GroupNumRemap* map)\r
+{\r
+ int i;\r
+\r
+ if (e->back_num > 1) {\r
+ for (i = 0; i < e->back_num; i++) {\r
+ e->back_refs[i] = map[e->back_refs[i]].new_val;\r
+ }\r
+ }\r
+ else if (e->back_num == 1) {\r
+ e->back_ref1 = map[e->back_ref1].new_val;\r
+ }\r
+\r
+ return ST_CONTINUE;\r
+}\r
+\r
+extern int\r
+onig_renumber_name_table(regex_t* reg, GroupNumRemap* map)\r
+{\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ onig_st_foreach(t, i_renumber_name, (HashDataType )map);\r
+ }\r
+ return 0;\r
+}\r
+\r
+\r
+extern int\r
+onig_number_of_names(regex_t* reg)\r
+{\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t))\r
+ return t->num_entries;\r
+ else\r
+ return 0;\r
+}\r
+\r
+#else /* USE_ST_LIBRARY */\r
+\r
+#define INIT_NAMES_ALLOC_NUM 8\r
+\r
+typedef struct {\r
+ NameEntry* e;\r
+ int num;\r
+ int alloc;\r
+} NameTable;\r
+\r
+#ifdef ONIG_DEBUG\r
+extern int\r
+onig_print_names(FILE* fp, regex_t* reg)\r
+{\r
+ int i, j;\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t) && t->num > 0) {\r
+ fprintf(fp, "name table\n");\r
+ for (i = 0; i < t->num; i++) {\r
+ e = &(t->e[i]);\r
+ fprintf(fp, "%s: ", e->name);\r
+ if (e->back_num == 0) {\r
+ fputs("-", fp);\r
+ }\r
+ else if (e->back_num == 1) {\r
+ fprintf(fp, "%d", e->back_ref1);\r
+ }\r
+ else {\r
+ for (j = 0; j < e->back_num; j++) {\r
+ if (j > 0) fprintf(fp, ", ");\r
+ fprintf(fp, "%d", e->back_refs[j]);\r
+ }\r
+ }\r
+ fputs("\n", fp);\r
+ }\r
+ fputs("\n", fp);\r
+ }\r
+ return 0;\r
+}\r
+#endif\r
+\r
+static int\r
+names_clear(regex_t* reg)\r
+{\r
+ int i;\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ for (i = 0; i < t->num; i++) {\r
+ e = &(t->e[i]);\r
+ if (IS_NOT_NULL(e->name)) {\r
+ xfree(e->name);\r
+ e->name = NULL;\r
+ e->name_len = 0;\r
+ e->back_num = 0;\r
+ e->back_alloc = 0;\r
+ if (IS_NOT_NULL(e->back_refs)) xfree(e->back_refs);\r
+ e->back_refs = (int* )NULL;\r
+ }\r
+ }\r
+ if (IS_NOT_NULL(t->e)) {\r
+ xfree(t->e);\r
+ t->e = NULL;\r
+ }\r
+ t->num = 0;\r
+ }\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_names_free(regex_t* reg)\r
+{\r
+ int r;\r
+ NameTable* t;\r
+\r
+ r = names_clear(reg);\r
+ if (r) return r;\r
+\r
+ t = (NameTable* )reg->name_table;\r
+ if (IS_NOT_NULL(t)) xfree(t);\r
+ reg->name_table = NULL;\r
+ return 0;\r
+}\r
+\r
+static NameEntry*\r
+name_find(regex_t* reg, UChar* name, UChar* name_end)\r
+{\r
+ int i, len;\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ len = name_end - name;\r
+ for (i = 0; i < t->num; i++) {\r
+ e = &(t->e[i]);\r
+ if (len == e->name_len && onig_strncmp(name, e->name, len) == 0)\r
+ return e;\r
+ }\r
+ }\r
+ return (NameEntry* )NULL;\r
+}\r
+\r
+extern int\r
+onig_foreach_name(regex_t* reg,\r
+ int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\r
+{\r
+ int i, r;\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t)) {\r
+ for (i = 0; i < t->num; i++) {\r
+ e = &(t->e[i]);\r
+ r = (*func)(e->name, e->name + e->name_len, e->back_num,\r
+ (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),\r
+ reg, arg);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_number_of_names(regex_t* reg)\r
+{\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (IS_NOT_NULL(t))\r
+ return t->num;\r
+ else\r
+ return 0;\r
+}\r
+\r
+#endif /* else USE_ST_LIBRARY */\r
+\r
+static int\r
+name_add(regex_t* reg, UChar* name, UChar* name_end, int backref, ScanEnv* env)\r
+{\r
+ int alloc;\r
+ NameEntry* e;\r
+ NameTable* t = (NameTable* )reg->name_table;\r
+\r
+ if (name_end - name <= 0)\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+\r
+ e = name_find(reg, name, name_end);\r
+ if (IS_NULL(e)) {\r
+#ifdef USE_ST_LIBRARY\r
+ if (IS_NULL(t)) {\r
+ t = onig_st_init_strend_table_with_size(5);\r
+ reg->name_table = (void* )t;\r
+ }\r
+ e = (NameEntry* )xmalloc(sizeof(NameEntry));\r
+ CHECK_NULL_RETURN_MEMERR(e);\r
+\r
+ e->name = strdup_with_null(reg->enc, name, name_end);\r
+ if (IS_NULL(e->name)) {\r
+ xfree(e); return ONIGERR_MEMORY;\r
+ }\r
+ onig_st_insert_strend(t, e->name, (e->name + (name_end - name)),\r
+ (HashDataType )e);\r
+\r
+ e->name_len = (int)(name_end - name);\r
+ e->back_num = 0;\r
+ e->back_alloc = 0;\r
+ e->back_refs = (int* )NULL;\r
+\r
+#else\r
+\r
+ if (IS_NULL(t)) {\r
+ alloc = INIT_NAMES_ALLOC_NUM;\r
+ t = (NameTable* )xmalloc(sizeof(NameTable));\r
+ CHECK_NULL_RETURN_MEMERR(t);\r
+ t->e = NULL;\r
+ t->alloc = 0;\r
+ t->num = 0;\r
+\r
+ t->e = (NameEntry* )xmalloc(sizeof(NameEntry) * alloc);\r
+ if (IS_NULL(t->e)) {\r
+ xfree(t);\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ t->alloc = alloc;\r
+ reg->name_table = t;\r
+ goto clear;\r
+ }\r
+ else if (t->num == t->alloc) {\r
+ int i;\r
+\r
+ alloc = t->alloc * 2;\r
+ t->e = (NameEntry* )xrealloc(t->e, sizeof(NameEntry) * alloc);\r
+ CHECK_NULL_RETURN_MEMERR(t->e);\r
+ t->alloc = alloc;\r
+\r
+ clear:\r
+ for (i = t->num; i < t->alloc; i++) {\r
+ t->e[i].name = NULL;\r
+ t->e[i].name_len = 0;\r
+ t->e[i].back_num = 0;\r
+ t->e[i].back_alloc = 0;\r
+ t->e[i].back_refs = (int* )NULL;\r
+ }\r
+ }\r
+ e = &(t->e[t->num]);\r
+ t->num++;\r
+ e->name = strdup_with_null(reg->enc, name, name_end);\r
+ if (IS_NULL(e->name)) return ONIGERR_MEMORY;\r
+ e->name_len = name_end - name;\r
+#endif\r
+ }\r
+\r
+ if (e->back_num >= 1 &&\r
+ ! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME)) {\r
+ onig_scan_env_set_error_string(env, ONIGERR_MULTIPLEX_DEFINED_NAME,\r
+ name, name_end);\r
+ return ONIGERR_MULTIPLEX_DEFINED_NAME;\r
+ }\r
+\r
+ e->back_num++;\r
+ if (e->back_num == 1) {\r
+ e->back_ref1 = backref;\r
+ }\r
+ else {\r
+ if (e->back_num == 2) {\r
+ alloc = INIT_NAME_BACKREFS_ALLOC_NUM;\r
+ e->back_refs = (int* )xmalloc(sizeof(int) * alloc);\r
+ CHECK_NULL_RETURN_MEMERR(e->back_refs);\r
+ e->back_alloc = alloc;\r
+ e->back_refs[0] = e->back_ref1;\r
+ e->back_refs[1] = backref;\r
+ }\r
+ else {\r
+ if (e->back_num > e->back_alloc) {\r
+ alloc = e->back_alloc * 2;\r
+ e->back_refs = (int* )xrealloc(e->back_refs, sizeof(int) * alloc, sizeof(int) * e->back_alloc);\r
+ CHECK_NULL_RETURN_MEMERR(e->back_refs);\r
+ e->back_alloc = alloc;\r
+ }\r
+ e->back_refs[e->back_num - 1] = backref;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_name_to_group_numbers(regex_t* reg, const UChar* name,\r
+ const UChar* name_end, int** nums)\r
+{\r
+ NameEntry* e = name_find(reg, name, name_end);\r
+\r
+ if (IS_NULL(e)) return ONIGERR_UNDEFINED_NAME_REFERENCE;\r
+\r
+ switch (e->back_num) {\r
+ case 0:\r
+ break;\r
+ case 1:\r
+ *nums = &(e->back_ref1);\r
+ break;\r
+ default:\r
+ *nums = e->back_refs;\r
+ break;\r
+ }\r
+ return e->back_num;\r
+}\r
+\r
+extern int\r
+onig_name_to_backref_number(regex_t* reg, const UChar* name,\r
+ const UChar* name_end, OnigRegion *region)\r
+{\r
+ int i, n, *nums;\r
+\r
+ n = onig_name_to_group_numbers(reg, name, name_end, &nums);\r
+ if (n < 0)\r
+ return n;\r
+ else if (n == 0)\r
+ return ONIGERR_PARSER_BUG;\r
+ else if (n == 1)\r
+ return nums[0];\r
+ else {\r
+ if (IS_NOT_NULL(region)) {\r
+ for (i = n - 1; i >= 0; i--) {\r
+ if (region->beg[nums[i]] != ONIG_REGION_NOTPOS)\r
+ return nums[i];\r
+ }\r
+ }\r
+ return nums[n - 1];\r
+ }\r
+}\r
+\r
+#else /* USE_NAMED_GROUP */\r
+\r
+extern int\r
+onig_name_to_group_numbers(regex_t* reg, const UChar* name,\r
+ const UChar* name_end, int** nums)\r
+{\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+}\r
+\r
+extern int\r
+onig_name_to_backref_number(regex_t* reg, const UChar* name,\r
+ const UChar* name_end, OnigRegion* region)\r
+{\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+}\r
+\r
+extern int\r
+onig_foreach_name(regex_t* reg,\r
+ int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\r
+{\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+}\r
+\r
+extern int\r
+onig_number_of_names(regex_t* reg)\r
+{\r
+ return 0;\r
+}\r
+#endif /* else USE_NAMED_GROUP */\r
+\r
+extern int\r
+onig_noname_group_capture_is_active(regex_t* reg)\r
+{\r
+ if (ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_DONT_CAPTURE_GROUP))\r
+ return 0;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ if (onig_number_of_names(reg) > 0 &&\r
+ IS_SYNTAX_BV(reg->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\r
+ !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {\r
+ return 0;\r
+ }\r
+#endif\r
+\r
+ return 1;\r
+}\r
+\r
+\r
+#define INIT_SCANENV_MEMNODES_ALLOC_SIZE 16\r
+\r
+static void\r
+scan_env_clear(ScanEnv* env)\r
+{\r
+ int i;\r
+\r
+ BIT_STATUS_CLEAR(env->capture_history);\r
+ BIT_STATUS_CLEAR(env->bt_mem_start);\r
+ BIT_STATUS_CLEAR(env->bt_mem_end);\r
+ BIT_STATUS_CLEAR(env->backrefed_mem);\r
+ env->error = (UChar* )NULL;\r
+ env->error_end = (UChar* )NULL;\r
+ env->num_call = 0;\r
+ env->num_mem = 0;\r
+#ifdef USE_NAMED_GROUP\r
+ env->num_named = 0;\r
+#endif\r
+ env->mem_alloc = 0;\r
+ env->mem_nodes_dynamic = (Node** )NULL;\r
+\r
+ for (i = 0; i < SCANENV_MEMNODES_SIZE; i++)\r
+ env->mem_nodes_static[i] = NULL_NODE;\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ env->num_comb_exp_check = 0;\r
+ env->comb_exp_max_regnum = 0;\r
+ env->curr_max_regnum = 0;\r
+ env->has_recursion = 0;\r
+#endif\r
+}\r
+\r
+static int\r
+scan_env_add_mem_entry(ScanEnv* env)\r
+{\r
+ int i, need, alloc;\r
+ Node** p;\r
+\r
+ need = env->num_mem + 1;\r
+ if (need >= SCANENV_MEMNODES_SIZE) {\r
+ if (env->mem_alloc <= need) {\r
+ if (IS_NULL(env->mem_nodes_dynamic)) {\r
+ alloc = INIT_SCANENV_MEMNODES_ALLOC_SIZE;\r
+ p = (Node** )xmalloc(sizeof(Node*) * alloc);\r
+ xmemcpy(p, env->mem_nodes_static,\r
+ sizeof(Node*) * SCANENV_MEMNODES_SIZE);\r
+ }\r
+ else {\r
+ alloc = env->mem_alloc * 2;\r
+ p = (Node** )xrealloc(env->mem_nodes_dynamic, sizeof(Node*) * alloc, sizeof(Node*) * env->mem_alloc);\r
+ }\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+\r
+ for (i = env->num_mem + 1; i < alloc; i++)\r
+ p[i] = NULL_NODE;\r
+\r
+ env->mem_nodes_dynamic = p;\r
+ env->mem_alloc = alloc;\r
+ }\r
+ }\r
+\r
+ env->num_mem++;\r
+ return env->num_mem;\r
+}\r
+\r
+static int\r
+scan_env_set_mem_node(ScanEnv* env, int num, Node* node)\r
+{\r
+ if (env->num_mem >= num)\r
+ SCANENV_MEM_NODES(env)[num] = node;\r
+ else\r
+ return ONIGERR_PARSER_BUG;\r
+ return 0;\r
+}\r
+\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+typedef struct _FreeNode {\r
+ struct _FreeNode* next;\r
+} FreeNode;\r
+\r
+static FreeNode* FreeNodeList = (FreeNode* )NULL;\r
+#endif\r
+\r
+extern void\r
+onig_node_free(Node* node)\r
+{\r
+ start:\r
+ if (IS_NULL(node)) return ;\r
+\r
+ switch (NTYPE(node)) {\r
+ case NT_STR:\r
+ if (NSTR(node)->capa != 0 &&\r
+ IS_NOT_NULL(NSTR(node)->s) && NSTR(node)->s != NSTR(node)->buf) {\r
+ xfree(NSTR(node)->s);\r
+ }\r
+ break;\r
+\r
+ case NT_LIST:\r
+ case NT_ALT:\r
+ onig_node_free(NCAR(node));\r
+ {\r
+ Node* next_node = NCDR(node);\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+ {\r
+ FreeNode* n = (FreeNode* )node;\r
+\r
+ THREAD_ATOMIC_START;\r
+ n->next = FreeNodeList;\r
+ FreeNodeList = n;\r
+ THREAD_ATOMIC_END;\r
+ }\r
+#else\r
+ xfree(node);\r
+#endif\r
+ node = next_node;\r
+ goto start;\r
+ }\r
+ break;\r
+\r
+ case NT_CCLASS:\r
+ {\r
+ CClassNode* cc = NCCLASS(node);\r
+\r
+ if (IS_NCCLASS_SHARE(cc)) return ;\r
+ if (cc->mbuf)\r
+ bbuf_free(cc->mbuf);\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ if (NQTFR(node)->target)\r
+ onig_node_free(NQTFR(node)->target);\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ if (NENCLOSE(node)->target)\r
+ onig_node_free(NENCLOSE(node)->target);\r
+ break;\r
+\r
+ case NT_BREF:\r
+ if (IS_NOT_NULL(NBREF(node)->back_dynamic))\r
+ xfree(NBREF(node)->back_dynamic);\r
+ break;\r
+\r
+ case NT_ANCHOR:\r
+ if (NANCHOR(node)->target)\r
+ onig_node_free(NANCHOR(node)->target);\r
+ break;\r
+ }\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+ {\r
+ FreeNode* n = (FreeNode* )node;\r
+\r
+ THREAD_ATOMIC_START;\r
+ n->next = FreeNodeList;\r
+ FreeNodeList = n;\r
+ THREAD_ATOMIC_END;\r
+ }\r
+#else\r
+ xfree(node);\r
+#endif\r
+}\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+extern int\r
+onig_free_node_list(void)\r
+{\r
+ FreeNode* n;\r
+\r
+ /* THREAD_ATOMIC_START; */\r
+ while (IS_NOT_NULL(FreeNodeList)) {\r
+ n = FreeNodeList;\r
+ FreeNodeList = FreeNodeList->next;\r
+ xfree(n);\r
+ }\r
+ /* THREAD_ATOMIC_END; */\r
+ return 0;\r
+}\r
+#endif\r
+\r
+static Node*\r
+node_new(void)\r
+{\r
+ Node* node;\r
+\r
+#ifdef USE_PARSE_TREE_NODE_RECYCLE\r
+ THREAD_ATOMIC_START;\r
+ if (IS_NOT_NULL(FreeNodeList)) {\r
+ node = (Node* )FreeNodeList;\r
+ FreeNodeList = FreeNodeList->next;\r
+ THREAD_ATOMIC_END;\r
+ return node;\r
+ }\r
+ THREAD_ATOMIC_END;\r
+#endif\r
+\r
+ node = (Node* )xmalloc(sizeof(Node));\r
+ /* xmemset(node, 0, sizeof(Node)); */\r
+ return node;\r
+}\r
+\r
+\r
+static void\r
+initialize_cclass(CClassNode* cc)\r
+{\r
+ BITSET_CLEAR(cc->bs);\r
+ /* cc->base.flags = 0; */\r
+ cc->flags = 0;\r
+ cc->mbuf = NULL;\r
+}\r
+\r
+static Node*\r
+node_new_cclass(void)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_CCLASS);\r
+ initialize_cclass(NCCLASS(node));\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_cclass_by_codepoint_range(int not, OnigCodePoint sb_out,\r
+ const OnigCodePoint ranges[])\r
+{\r
+ int n, i;\r
+ CClassNode* cc;\r
+ OnigCodePoint j;\r
+\r
+ Node* node = node_new_cclass();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ cc = NCCLASS(node);\r
+ if (not != 0) NCCLASS_SET_NOT(cc);\r
+\r
+ BITSET_CLEAR(cc->bs);\r
+ if (sb_out > 0 && IS_NOT_NULL(ranges)) {\r
+ n = ONIGENC_CODE_RANGE_NUM(ranges);\r
+ for (i = 0; i < n; i++) {\r
+ for (j = ONIGENC_CODE_RANGE_FROM(ranges, i);\r
+ j <= (OnigCodePoint )ONIGENC_CODE_RANGE_TO(ranges, i); j++) {\r
+ if (j >= sb_out) goto sb_end;\r
+\r
+ BITSET_SET_BIT(cc->bs, j);\r
+ }\r
+ }\r
+ }\r
+\r
+ sb_end:\r
+ if (IS_NULL(ranges)) {\r
+ is_null:\r
+ cc->mbuf = NULL;\r
+ }\r
+ else {\r
+ BBuf* bbuf;\r
+\r
+ n = ONIGENC_CODE_RANGE_NUM(ranges);\r
+ if (n == 0) goto is_null;\r
+\r
+ bbuf = (BBuf* )xmalloc(sizeof(BBuf));\r
+ CHECK_NULL_RETURN(bbuf);\r
+ bbuf->alloc = n + 1;\r
+ bbuf->used = n + 1;\r
+ bbuf->p = (UChar* )((void* )ranges);\r
+\r
+ cc->mbuf = bbuf;\r
+ }\r
+\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_ctype(int type, int not)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_CTYPE);\r
+ NCTYPE(node)->ctype = type;\r
+ NCTYPE(node)->not = not;\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_anychar(void)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_CANY);\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_list(Node* left, Node* right)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_LIST);\r
+ NCAR(node) = left;\r
+ NCDR(node) = right;\r
+ return node;\r
+}\r
+\r
+extern Node*\r
+onig_node_new_list(Node* left, Node* right)\r
+{\r
+ return node_new_list(left, right);\r
+}\r
+\r
+extern Node*\r
+onig_node_list_add(Node* list, Node* x)\r
+{\r
+ Node *n;\r
+\r
+ n = onig_node_new_list(x, NULL);\r
+ if (IS_NULL(n)) return NULL_NODE;\r
+\r
+ if (IS_NOT_NULL(list)) {\r
+ while (IS_NOT_NULL(NCDR(list)))\r
+ list = NCDR(list);\r
+\r
+ NCDR(list) = n;\r
+ }\r
+\r
+ return n;\r
+}\r
+\r
+extern Node*\r
+onig_node_new_alt(Node* left, Node* right)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_ALT);\r
+ NCAR(node) = left;\r
+ NCDR(node) = right;\r
+ return node;\r
+}\r
+\r
+extern Node*\r
+onig_node_new_anchor(int type)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_ANCHOR);\r
+ NANCHOR(node)->type = type;\r
+ NANCHOR(node)->target = NULL;\r
+ NANCHOR(node)->char_len = -1;\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_backref(int back_num, int* backrefs, int by_name,\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ int exist_level, int nest_level,\r
+#endif\r
+ ScanEnv* env)\r
+{\r
+ int i;\r
+ Node* node = node_new();\r
+\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_BREF);\r
+ NBREF(node)->state = 0;\r
+ NBREF(node)->back_num = back_num;\r
+ NBREF(node)->back_dynamic = (int* )NULL;\r
+ if (by_name != 0)\r
+ NBREF(node)->state |= NST_NAME_REF;\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ if (exist_level != 0) {\r
+ NBREF(node)->state |= NST_NEST_LEVEL;\r
+ NBREF(node)->nest_level = nest_level;\r
+ }\r
+#endif\r
+\r
+ for (i = 0; i < back_num; i++) {\r
+ if (backrefs[i] <= env->num_mem &&\r
+ IS_NULL(SCANENV_MEM_NODES(env)[backrefs[i]])) {\r
+ NBREF(node)->state |= NST_RECURSION; /* /...(\1).../ */\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (back_num <= NODE_BACKREFS_SIZE) {\r
+ for (i = 0; i < back_num; i++)\r
+ NBREF(node)->back_static[i] = backrefs[i];\r
+ }\r
+ else {\r
+ int* p = (int* )xmalloc(sizeof(int) * back_num);\r
+ if (IS_NULL(p)) {\r
+ onig_node_free(node);\r
+ return NULL;\r
+ }\r
+ NBREF(node)->back_dynamic = p;\r
+ for (i = 0; i < back_num; i++)\r
+ p[i] = backrefs[i];\r
+ }\r
+ return node;\r
+}\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+static Node*\r
+node_new_call(UChar* name, UChar* name_end, int gnum)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_CALL);\r
+ NCALL(node)->state = 0;\r
+ NCALL(node)->target = NULL_NODE;\r
+ NCALL(node)->name = name;\r
+ NCALL(node)->name_end = name_end;\r
+ NCALL(node)->group_num = gnum; /* call by number if gnum != 0 */\r
+ return node;\r
+}\r
+#endif\r
+\r
+static Node*\r
+node_new_quantifier(int lower, int upper, int by_number)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_QTFR);\r
+ NQTFR(node)->state = 0;\r
+ NQTFR(node)->target = NULL;\r
+ NQTFR(node)->lower = lower;\r
+ NQTFR(node)->upper = upper;\r
+ NQTFR(node)->greedy = 1;\r
+ NQTFR(node)->target_empty_info = NQ_TARGET_ISNOT_EMPTY;\r
+ NQTFR(node)->head_exact = NULL_NODE;\r
+ NQTFR(node)->next_head_exact = NULL_NODE;\r
+ NQTFR(node)->is_refered = 0;\r
+ if (by_number != 0)\r
+ NQTFR(node)->state |= NST_BY_NUMBER;\r
+\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ NQTFR(node)->comb_exp_check_num = 0;\r
+#endif\r
+\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_enclose(int type)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_ENCLOSE);\r
+ NENCLOSE(node)->type = type;\r
+ NENCLOSE(node)->state = 0;\r
+ NENCLOSE(node)->regnum = 0;\r
+ NENCLOSE(node)->option = 0;\r
+ NENCLOSE(node)->target = NULL;\r
+ NENCLOSE(node)->call_addr = -1;\r
+ NENCLOSE(node)->opt_count = 0;\r
+ return node;\r
+}\r
+\r
+extern Node*\r
+onig_node_new_enclose(int type)\r
+{\r
+ return node_new_enclose(type);\r
+}\r
+\r
+static Node*\r
+node_new_enclose_memory(OnigOptionType option, int is_named)\r
+{\r
+ Node* node = node_new_enclose(ENCLOSE_MEMORY);\r
+ CHECK_NULL_RETURN(node);\r
+ if (is_named != 0)\r
+ SET_ENCLOSE_STATUS(node, NST_NAMED_GROUP);\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ NENCLOSE(node)->option = option;\r
+#endif\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_option(OnigOptionType option)\r
+{\r
+ Node* node = node_new_enclose(ENCLOSE_OPTION);\r
+ CHECK_NULL_RETURN(node);\r
+ NENCLOSE(node)->option = option;\r
+ return node;\r
+}\r
+\r
+extern int\r
+onig_node_str_cat(Node* node, const UChar* s, const UChar* end)\r
+{\r
+ int addlen = (int)(end - s);\r
+\r
+ if (addlen > 0) {\r
+ int len = (int)(NSTR(node)->end - NSTR(node)->s);\r
+\r
+ if (NSTR(node)->capa > 0 || (len + addlen > NODE_STR_BUF_SIZE - 1)) {\r
+ UChar* p;\r
+ int capa = len + addlen + NODE_STR_MARGIN;\r
+\r
+ if (capa <= NSTR(node)->capa) {\r
+ onig_strcpy(NSTR(node)->s + len, s, end);\r
+ }\r
+ else {\r
+ if (NSTR(node)->s == NSTR(node)->buf)\r
+ p = strcat_capa_from_static(NSTR(node)->s, NSTR(node)->end,\r
+ s, end, capa);\r
+ else\r
+ p = strcat_capa(NSTR(node)->s, NSTR(node)->end, s, end, capa, NSTR(node)->capa);\r
+\r
+ CHECK_NULL_RETURN_MEMERR(p);\r
+ NSTR(node)->s = p;\r
+ NSTR(node)->capa = capa;\r
+ }\r
+ }\r
+ else {\r
+ onig_strcpy(NSTR(node)->s + len, s, end);\r
+ }\r
+ NSTR(node)->end = NSTR(node)->s + len + addlen;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_node_str_set(Node* node, const UChar* s, const UChar* end)\r
+{\r
+ onig_node_str_clear(node);\r
+ return onig_node_str_cat(node, s, end);\r
+}\r
+\r
+static int\r
+node_str_cat_char(Node* node, UChar c)\r
+{\r
+ UChar s[1];\r
+\r
+ s[0] = c;\r
+ return onig_node_str_cat(node, s, s + 1);\r
+}\r
+\r
+extern void\r
+onig_node_conv_to_str_node(Node* node, int flag)\r
+{\r
+ SET_NTYPE(node, NT_STR);\r
+ NSTR(node)->flag = flag;\r
+ NSTR(node)->capa = 0;\r
+ NSTR(node)->s = NSTR(node)->buf;\r
+ NSTR(node)->end = NSTR(node)->buf;\r
+}\r
+\r
+extern void\r
+onig_node_str_clear(Node* node)\r
+{\r
+ if (NSTR(node)->capa != 0 &&\r
+ IS_NOT_NULL(NSTR(node)->s) && NSTR(node)->s != NSTR(node)->buf) {\r
+ xfree(NSTR(node)->s);\r
+ }\r
+\r
+ NSTR(node)->capa = 0;\r
+ NSTR(node)->flag = 0;\r
+ NSTR(node)->s = NSTR(node)->buf;\r
+ NSTR(node)->end = NSTR(node)->buf;\r
+}\r
+\r
+static Node*\r
+node_new_str(const UChar* s, const UChar* end)\r
+{\r
+ Node* node = node_new();\r
+ CHECK_NULL_RETURN(node);\r
+\r
+ SET_NTYPE(node, NT_STR);\r
+ NSTR(node)->capa = 0;\r
+ NSTR(node)->flag = 0;\r
+ NSTR(node)->s = NSTR(node)->buf;\r
+ NSTR(node)->end = NSTR(node)->buf;\r
+ if (onig_node_str_cat(node, s, end)) {\r
+ onig_node_free(node);\r
+ return NULL;\r
+ }\r
+ return node;\r
+}\r
+\r
+extern Node*\r
+onig_node_new_str(const UChar* s, const UChar* end)\r
+{\r
+ return node_new_str(s, end);\r
+}\r
+\r
+static Node*\r
+node_new_str_raw(UChar* s, UChar* end)\r
+{\r
+ Node* node = node_new_str(s, end);\r
+ NSTRING_SET_RAW(node);\r
+ return node;\r
+}\r
+\r
+static Node*\r
+node_new_empty(void)\r
+{\r
+ return node_new_str(NULL, NULL);\r
+}\r
+\r
+static Node*\r
+node_new_str_raw_char(UChar c)\r
+{\r
+ UChar p[1];\r
+\r
+ p[0] = c;\r
+ return node_new_str_raw(p, p + 1);\r
+}\r
+\r
+static Node*\r
+str_node_split_last_char(StrNode* sn, OnigEncoding enc)\r
+{\r
+ const UChar *p;\r
+ Node* n = NULL_NODE;\r
+\r
+ if (sn->end > sn->s) {\r
+ p = onigenc_get_prev_char_head(enc, sn->s, sn->end);\r
+ if (p && p > sn->s) { /* can be splitted. */\r
+ n = node_new_str(p, sn->end);\r
+ if ((sn->flag & NSTR_RAW) != 0)\r
+ NSTRING_SET_RAW(n);\r
+ sn->end = (UChar* )p;\r
+ }\r
+ }\r
+ return n;\r
+}\r
+\r
+static int\r
+str_node_can_be_split(StrNode* sn, OnigEncoding enc)\r
+{\r
+ if (sn->end > sn->s) {\r
+ return ((enclen(enc, sn->s) < sn->end - sn->s) ? 1 : 0);\r
+ }\r
+ return 0;\r
+}\r
+\r
+#ifdef USE_PAD_TO_SHORT_BYTE_CHAR\r
+static int\r
+node_str_head_pad(StrNode* sn, int num, UChar val)\r
+{\r
+ UChar buf[NODE_STR_BUF_SIZE];\r
+ int i, len;\r
+\r
+ len = sn->end - sn->s;\r
+ onig_strcpy(buf, sn->s, sn->end);\r
+ onig_strcpy(&(sn->s[num]), buf, buf + len);\r
+ sn->end += num;\r
+\r
+ for (i = 0; i < num; i++) {\r
+ sn->s[i] = val;\r
+ }\r
+}\r
+#endif\r
+\r
+extern int\r
+onig_scan_unsigned_number(UChar** src, const UChar* end, OnigEncoding enc)\r
+{\r
+ unsigned int num, val;\r
+ OnigCodePoint c;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ num = 0;\r
+ while (!PEND) {\r
+ PFETCH(c);\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ val = (unsigned int )DIGITVAL(c);\r
+ if ((INT_MAX_LIMIT - val) / 10UL < num)\r
+ return -1; /* overflow */\r
+\r
+ num = num * 10 + val;\r
+ }\r
+ else {\r
+ PUNFETCH;\r
+ break;\r
+ }\r
+ }\r
+ *src = p;\r
+ return num;\r
+}\r
+\r
+static int\r
+scan_unsigned_hexadecimal_number(UChar** src, UChar* end, int maxlen,\r
+ OnigEncoding enc)\r
+{\r
+ OnigCodePoint c;\r
+ unsigned int num, val;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ num = 0;\r
+ while (!PEND && maxlen-- != 0) {\r
+ PFETCH(c);\r
+ if (ONIGENC_IS_CODE_XDIGIT(enc, c)) {\r
+ val = (unsigned int )XDIGITVAL(enc,c);\r
+ if ((INT_MAX_LIMIT - val) / 16UL < num)\r
+ return -1; /* overflow */\r
+\r
+ num = (num << 4) + XDIGITVAL(enc,c);\r
+ }\r
+ else {\r
+ PUNFETCH;\r
+ break;\r
+ }\r
+ }\r
+ *src = p;\r
+ return num;\r
+}\r
+\r
+static int\r
+scan_unsigned_octal_number(UChar** src, UChar* end, int maxlen,\r
+ OnigEncoding enc)\r
+{\r
+ OnigCodePoint c;\r
+ unsigned int num, val;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ num = 0;\r
+ while (!PEND && maxlen-- != 0) {\r
+ PFETCH(c);\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c) && c < '8') {\r
+ val = ODIGITVAL(c);\r
+ if ((INT_MAX_LIMIT - val) / 8UL < num)\r
+ return -1; /* overflow */\r
+\r
+ num = (num << 3) + val;\r
+ }\r
+ else {\r
+ PUNFETCH;\r
+ break;\r
+ }\r
+ }\r
+ *src = p;\r
+ return num;\r
+}\r
+\r
+\r
+#define BBUF_WRITE_CODE_POINT(bbuf,pos,code) \\r
+ BBUF_WRITE(bbuf, pos, &(code), SIZE_CODE_POINT)\r
+\r
+/* data format:\r
+ [n][from-1][to-1][from-2][to-2] ... [from-n][to-n]\r
+ (all data size is OnigCodePoint)\r
+ */\r
+static int\r
+new_code_range(BBuf** pbuf)\r
+{\r
+#define INIT_MULTI_BYTE_RANGE_SIZE (SIZE_CODE_POINT * 5)\r
+ int r;\r
+ OnigCodePoint n;\r
+ BBuf* bbuf;\r
+\r
+ bbuf = *pbuf = (BBuf* )xmalloc(sizeof(BBuf));\r
+ CHECK_NULL_RETURN_MEMERR(*pbuf);\r
+ r = BBUF_INIT(*pbuf, INIT_MULTI_BYTE_RANGE_SIZE);\r
+ if (r) return r;\r
+\r
+ n = 0;\r
+ BBUF_WRITE_CODE_POINT(bbuf, 0, n);\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_code_range_to_buf(BBuf** pbuf, OnigCodePoint from, OnigCodePoint to)\r
+{\r
+ int r, inc_n, pos;\r
+ int low, high, bound, x;\r
+ OnigCodePoint n, *data;\r
+ BBuf* bbuf;\r
+\r
+ if (from > to) {\r
+ n = from; from = to; to = n;\r
+ }\r
+\r
+ if (IS_NULL(*pbuf)) {\r
+ r = new_code_range(pbuf);\r
+ if (r) return r;\r
+ bbuf = *pbuf;\r
+ n = 0;\r
+ }\r
+ else {\r
+ bbuf = *pbuf;\r
+ GET_CODE_POINT(n, bbuf->p);\r
+ }\r
+ data = (OnigCodePoint* )(bbuf->p);\r
+ data++;\r
+\r
+ for (low = 0, bound = n; low < bound; ) {\r
+ x = (low + bound) >> 1;\r
+ if (from > data[x*2 + 1])\r
+ low = x + 1;\r
+ else\r
+ bound = x;\r
+ }\r
+\r
+ for (high = low, bound = n; high < bound; ) {\r
+ x = (high + bound) >> 1;\r
+ if (to >= data[x*2] - 1)\r
+ high = x + 1;\r
+ else\r
+ bound = x;\r
+ }\r
+\r
+ inc_n = low + 1 - high;\r
+ if (n + inc_n > ONIG_MAX_MULTI_BYTE_RANGES_NUM)\r
+ return ONIGERR_TOO_MANY_MULTI_BYTE_RANGES;\r
+\r
+ if (inc_n != 1) {\r
+ if (from > data[low*2])\r
+ from = data[low*2];\r
+ if (to < data[(high - 1)*2 + 1])\r
+ to = data[(high - 1)*2 + 1];\r
+ }\r
+\r
+ if (inc_n != 0 && (OnigCodePoint )high < n) {\r
+ int from_pos = SIZE_CODE_POINT * (1 + high * 2);\r
+ int to_pos = SIZE_CODE_POINT * (1 + (low + 1) * 2);\r
+ int size = (n - high) * 2 * SIZE_CODE_POINT;\r
+\r
+ if (inc_n > 0) {\r
+ BBUF_MOVE_RIGHT(bbuf, from_pos, to_pos, size);\r
+ }\r
+ else {\r
+ BBUF_MOVE_LEFT_REDUCE(bbuf, from_pos, to_pos);\r
+ }\r
+ }\r
+\r
+ pos = SIZE_CODE_POINT * (1 + low * 2);\r
+ BBUF_ENSURE_SIZE(bbuf, pos + SIZE_CODE_POINT * 2);\r
+ BBUF_WRITE_CODE_POINT(bbuf, pos, from);\r
+ BBUF_WRITE_CODE_POINT(bbuf, pos + SIZE_CODE_POINT, to);\r
+ n += inc_n;\r
+ BBUF_WRITE_CODE_POINT(bbuf, 0, n);\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_code_range(BBuf** pbuf, ScanEnv* env, OnigCodePoint from, OnigCodePoint to)\r
+{\r
+ if (from > to) {\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\r
+ return 0;\r
+ else\r
+ return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\r
+ }\r
+\r
+ return add_code_range_to_buf(pbuf, from, to);\r
+}\r
+\r
+static int\r
+not_code_range_buf(OnigEncoding enc, BBuf* bbuf, BBuf** pbuf)\r
+{\r
+ int r, i, n;\r
+ OnigCodePoint pre, from, *data, to = 0;\r
+\r
+ *pbuf = (BBuf* )NULL;\r
+ if (IS_NULL(bbuf)) {\r
+ set_all:\r
+ return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\r
+ }\r
+\r
+ data = (OnigCodePoint* )(bbuf->p);\r
+ GET_CODE_POINT(n, data);\r
+ data++;\r
+ if (n <= 0) goto set_all;\r
+\r
+ r = 0;\r
+ pre = MBCODE_START_POS(enc);\r
+ for (i = 0; i < n; i++) {\r
+ from = data[i*2];\r
+ to = data[i*2+1];\r
+ if (pre <= from - 1) {\r
+ r = add_code_range_to_buf(pbuf, pre, from - 1);\r
+ if (r != 0) return r;\r
+ }\r
+ if (to == ~((OnigCodePoint )0)) break;\r
+ pre = to + 1;\r
+ }\r
+ if (to < ~((OnigCodePoint )0)) {\r
+ r = add_code_range_to_buf(pbuf, to + 1, ~((OnigCodePoint )0));\r
+ }\r
+ return r;\r
+}\r
+\r
+#define SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2) do {\\r
+ BBuf *tbuf; \\r
+ int tnot; \\r
+ tnot = not1; not1 = not2; not2 = tnot; \\r
+ tbuf = bbuf1; bbuf1 = bbuf2; bbuf2 = tbuf; \\r
+} while (0)\r
+\r
+static int\r
+or_code_range_buf(OnigEncoding enc, BBuf* bbuf1, int not1,\r
+ BBuf* bbuf2, int not2, BBuf** pbuf)\r
+{\r
+ int r;\r
+ OnigCodePoint i, n1, *data1;\r
+ OnigCodePoint from, to;\r
+\r
+ *pbuf = (BBuf* )NULL;\r
+ if (IS_NULL(bbuf1) && IS_NULL(bbuf2)) {\r
+ if (not1 != 0 || not2 != 0)\r
+ return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\r
+ return 0;\r
+ }\r
+\r
+ r = 0;\r
+ if (IS_NULL(bbuf2))\r
+ SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\r
+\r
+ if (IS_NULL(bbuf1)) {\r
+ if (not1 != 0) {\r
+ return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\r
+ }\r
+ else {\r
+ if (not2 == 0) {\r
+ return bbuf_clone(pbuf, bbuf2);\r
+ }\r
+ else {\r
+ return not_code_range_buf(enc, bbuf2, pbuf);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (not1 != 0)\r
+ SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\r
+\r
+ data1 = (OnigCodePoint* )(bbuf1->p);\r
+ GET_CODE_POINT(n1, data1);\r
+ data1++;\r
+\r
+ if (not2 == 0 && not1 == 0) { /* 1 OR 2 */\r
+ r = bbuf_clone(pbuf, bbuf2);\r
+ }\r
+ else if (not1 == 0) { /* 1 OR (not 2) */\r
+ r = not_code_range_buf(enc, bbuf2, pbuf);\r
+ }\r
+ if (r != 0) return r;\r
+\r
+ for (i = 0; i < n1; i++) {\r
+ from = data1[i*2];\r
+ to = data1[i*2+1];\r
+ r = add_code_range_to_buf(pbuf, from, to);\r
+ if (r != 0) return r;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+and_code_range1(BBuf** pbuf, OnigCodePoint from1, OnigCodePoint to1,\r
+ OnigCodePoint* data, int n)\r
+{\r
+ int i, r;\r
+ OnigCodePoint from2, to2;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ from2 = data[i*2];\r
+ to2 = data[i*2+1];\r
+ if (from2 < from1) {\r
+ if (to2 < from1) continue;\r
+ else {\r
+ from1 = to2 + 1;\r
+ }\r
+ }\r
+ else if (from2 <= to1) {\r
+ if (to2 < to1) {\r
+ if (from1 <= from2 - 1) {\r
+ r = add_code_range_to_buf(pbuf, from1, from2-1);\r
+ if (r != 0) return r;\r
+ }\r
+ from1 = to2 + 1;\r
+ }\r
+ else {\r
+ to1 = from2 - 1;\r
+ }\r
+ }\r
+ else {\r
+ from1 = from2;\r
+ }\r
+ if (from1 > to1) break;\r
+ }\r
+ if (from1 <= to1) {\r
+ r = add_code_range_to_buf(pbuf, from1, to1);\r
+ if (r != 0) return r;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+and_code_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)\r
+{\r
+ int r;\r
+ OnigCodePoint i, j, n1, n2, *data1, *data2;\r
+ OnigCodePoint from, to, from1, to1, from2, to2;\r
+\r
+ *pbuf = (BBuf* )NULL;\r
+ if (IS_NULL(bbuf1)) {\r
+ if (not1 != 0 && IS_NOT_NULL(bbuf2)) /* not1 != 0 -> not2 == 0 */\r
+ return bbuf_clone(pbuf, bbuf2);\r
+ return 0;\r
+ }\r
+ else if (IS_NULL(bbuf2)) {\r
+ if (not2 != 0)\r
+ return bbuf_clone(pbuf, bbuf1);\r
+ return 0;\r
+ }\r
+\r
+ if (not1 != 0)\r
+ SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\r
+\r
+ data1 = (OnigCodePoint* )(bbuf1->p);\r
+ data2 = (OnigCodePoint* )(bbuf2->p);\r
+ GET_CODE_POINT(n1, data1);\r
+ GET_CODE_POINT(n2, data2);\r
+ data1++;\r
+ data2++;\r
+\r
+ if (not2 == 0 && not1 == 0) { /* 1 AND 2 */\r
+ for (i = 0; i < n1; i++) {\r
+ from1 = data1[i*2];\r
+ to1 = data1[i*2+1];\r
+ for (j = 0; j < n2; j++) {\r
+ from2 = data2[j*2];\r
+ to2 = data2[j*2+1];\r
+ if (from2 > to1) break;\r
+ if (to2 < from1) continue;\r
+ from = MAX(from1, from2);\r
+ to = MIN(to1, to2);\r
+ r = add_code_range_to_buf(pbuf, from, to);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ }\r
+ else if (not1 == 0) { /* 1 AND (not 2) */\r
+ for (i = 0; i < n1; i++) {\r
+ from1 = data1[i*2];\r
+ to1 = data1[i*2+1];\r
+ r = and_code_range1(pbuf, from1, to1, data2, n2);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+and_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)\r
+{\r
+ int r, not1, not2;\r
+ BBuf *buf1, *buf2, *pbuf;\r
+ BitSetRef bsr1, bsr2;\r
+ BitSet bs1, bs2;\r
+\r
+ not1 = IS_NCCLASS_NOT(dest);\r
+ bsr1 = dest->bs;\r
+ buf1 = dest->mbuf;\r
+ not2 = IS_NCCLASS_NOT(cc);\r
+ bsr2 = cc->bs;\r
+ buf2 = cc->mbuf;\r
+\r
+ if (not1 != 0) {\r
+ bitset_invert_to(bsr1, bs1);\r
+ bsr1 = bs1;\r
+ }\r
+ if (not2 != 0) {\r
+ bitset_invert_to(bsr2, bs2);\r
+ bsr2 = bs2;\r
+ }\r
+ bitset_and(bsr1, bsr2);\r
+ if (bsr1 != dest->bs) {\r
+ bitset_copy(dest->bs, bsr1);\r
+ bsr1 = dest->bs;\r
+ }\r
+ if (not1 != 0) {\r
+ bitset_invert(dest->bs);\r
+ }\r
+\r
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {\r
+ if (not1 != 0 && not2 != 0) {\r
+ r = or_code_range_buf(enc, buf1, 0, buf2, 0, &pbuf);\r
+ }\r
+ else {\r
+ r = and_code_range_buf(buf1, not1, buf2, not2, &pbuf);\r
+ if (r == 0 && not1 != 0) {\r
+ BBuf *tbuf;\r
+ r = not_code_range_buf(enc, pbuf, &tbuf);\r
+ if (r != 0) {\r
+ bbuf_free(pbuf);\r
+ return r;\r
+ }\r
+ bbuf_free(pbuf);\r
+ pbuf = tbuf;\r
+ }\r
+ }\r
+ if (r != 0) return r;\r
+\r
+ dest->mbuf = pbuf;\r
+ bbuf_free(buf1);\r
+ return r;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+or_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)\r
+{\r
+ int r, not1, not2;\r
+ BBuf *buf1, *buf2, *pbuf;\r
+ BitSetRef bsr1, bsr2;\r
+ BitSet bs1, bs2;\r
+\r
+ not1 = IS_NCCLASS_NOT(dest);\r
+ bsr1 = dest->bs;\r
+ buf1 = dest->mbuf;\r
+ not2 = IS_NCCLASS_NOT(cc);\r
+ bsr2 = cc->bs;\r
+ buf2 = cc->mbuf;\r
+\r
+ if (not1 != 0) {\r
+ bitset_invert_to(bsr1, bs1);\r
+ bsr1 = bs1;\r
+ }\r
+ if (not2 != 0) {\r
+ bitset_invert_to(bsr2, bs2);\r
+ bsr2 = bs2;\r
+ }\r
+ bitset_or(bsr1, bsr2);\r
+ if (bsr1 != dest->bs) {\r
+ bitset_copy(dest->bs, bsr1);\r
+ bsr1 = dest->bs;\r
+ }\r
+ if (not1 != 0) {\r
+ bitset_invert(dest->bs);\r
+ }\r
+\r
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {\r
+ if (not1 != 0 && not2 != 0) {\r
+ r = and_code_range_buf(buf1, 0, buf2, 0, &pbuf);\r
+ }\r
+ else {\r
+ r = or_code_range_buf(enc, buf1, not1, buf2, not2, &pbuf);\r
+ if (r == 0 && not1 != 0) {\r
+ BBuf *tbuf;\r
+ r = not_code_range_buf(enc, pbuf, &tbuf);\r
+ if (r != 0) {\r
+ bbuf_free(pbuf);\r
+ return r;\r
+ }\r
+ bbuf_free(pbuf);\r
+ pbuf = tbuf;\r
+ }\r
+ }\r
+ if (r != 0) return r;\r
+\r
+ dest->mbuf = pbuf;\r
+ bbuf_free(buf1);\r
+ return r;\r
+ }\r
+ else\r
+ return 0;\r
+}\r
+\r
+static int\r
+conv_backslash_value(int c, ScanEnv* env)\r
+{\r
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_CONTROL_CHARS)) {\r
+ switch (c) {\r
+ case 'n': return '\n';\r
+ case 't': return '\t';\r
+ case 'r': return '\r';\r
+ case 'f': return '\f';\r
+ case 'a': return '\007';\r
+ case 'b': return '\010';\r
+ case 'e': return '\033';\r
+ case 'v':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_V_VTAB))\r
+ return '\v';\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ return c;\r
+}\r
+\r
+static int\r
+is_invalid_quantifier_target(Node* node)\r
+{\r
+ switch (NTYPE(node)) {\r
+ case NT_ANCHOR:\r
+ return 1;\r
+ break;\r
+\r
+ case NT_ENCLOSE:\r
+ /* allow enclosed elements */\r
+ /* return is_invalid_quantifier_target(NENCLOSE(node)->target); */\r
+ break;\r
+\r
+ case NT_LIST:\r
+ do {\r
+ if (! is_invalid_quantifier_target(NCAR(node))) return 0;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ return 0;\r
+ break;\r
+\r
+ case NT_ALT:\r
+ do {\r
+ if (is_invalid_quantifier_target(NCAR(node))) return 1;\r
+ } while (IS_NOT_NULL(node = NCDR(node)));\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+\r
+/* ?:0, *:1, +:2, ??:3, *?:4, +?:5 */\r
+static int\r
+popular_quantifier_num(QtfrNode* q)\r
+{\r
+ if (q->greedy) {\r
+ if (q->lower == 0) {\r
+ if (q->upper == 1) return 0;\r
+ else if (IS_REPEAT_INFINITE(q->upper)) return 1;\r
+ }\r
+ else if (q->lower == 1) {\r
+ if (IS_REPEAT_INFINITE(q->upper)) return 2;\r
+ }\r
+ }\r
+ else {\r
+ if (q->lower == 0) {\r
+ if (q->upper == 1) return 3;\r
+ else if (IS_REPEAT_INFINITE(q->upper)) return 4;\r
+ }\r
+ else if (q->lower == 1) {\r
+ if (IS_REPEAT_INFINITE(q->upper)) return 5;\r
+ }\r
+ }\r
+ return -1;\r
+}\r
+\r
+\r
+enum ReduceType {\r
+ RQ_ASIS = 0, /* as is */\r
+ RQ_DEL = 1, /* delete parent */\r
+ RQ_A, /* to '*' */\r
+ RQ_AQ, /* to '*?' */\r
+ RQ_QQ, /* to '??' */\r
+ RQ_P_QQ, /* to '+)??' */\r
+ RQ_PQ_Q /* to '+?)?' */\r
+};\r
+\r
+static enum ReduceType ReduceTypeTable[6][6] = {\r
+ {RQ_DEL, RQ_A, RQ_A, RQ_QQ, RQ_AQ, RQ_ASIS}, /* '?' */\r
+ {RQ_DEL, RQ_DEL, RQ_DEL, RQ_P_QQ, RQ_P_QQ, RQ_DEL}, /* '*' */\r
+ {RQ_A, RQ_A, RQ_DEL, RQ_ASIS, RQ_P_QQ, RQ_DEL}, /* '+' */\r
+ {RQ_DEL, RQ_AQ, RQ_AQ, RQ_DEL, RQ_AQ, RQ_AQ}, /* '??' */\r
+ {RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL, RQ_DEL}, /* '*?' */\r
+ {RQ_ASIS, RQ_PQ_Q, RQ_DEL, RQ_AQ, RQ_AQ, RQ_DEL} /* '+?' */\r
+};\r
+\r
+extern void\r
+onig_reduce_nested_quantifier(Node* pnode, Node* cnode)\r
+{\r
+ int pnum, cnum;\r
+ QtfrNode *p, *c;\r
+\r
+ p = NQTFR(pnode);\r
+ c = NQTFR(cnode);\r
+ pnum = popular_quantifier_num(p);\r
+ cnum = popular_quantifier_num(c);\r
+ if (pnum < 0 || cnum < 0) return ;\r
+\r
+ switch(ReduceTypeTable[cnum][pnum]) {\r
+ case RQ_DEL:\r
+ *pnode = *cnode;\r
+ break;\r
+ case RQ_A:\r
+ p->target = c->target;\r
+ p->lower = 0; p->upper = REPEAT_INFINITE; p->greedy = 1;\r
+ break;\r
+ case RQ_AQ:\r
+ p->target = c->target;\r
+ p->lower = 0; p->upper = REPEAT_INFINITE; p->greedy = 0;\r
+ break;\r
+ case RQ_QQ:\r
+ p->target = c->target;\r
+ p->lower = 0; p->upper = 1; p->greedy = 0;\r
+ break;\r
+ case RQ_P_QQ:\r
+ p->target = cnode;\r
+ p->lower = 0; p->upper = 1; p->greedy = 0;\r
+ c->lower = 1; c->upper = REPEAT_INFINITE; c->greedy = 1;\r
+ return ;\r
+ break;\r
+ case RQ_PQ_Q:\r
+ p->target = cnode;\r
+ p->lower = 0; p->upper = 1; p->greedy = 1;\r
+ c->lower = 1; c->upper = REPEAT_INFINITE; c->greedy = 0;\r
+ return ;\r
+ break;\r
+ case RQ_ASIS:\r
+ p->target = cnode;\r
+ return ;\r
+ break;\r
+ }\r
+\r
+ c->target = NULL_NODE;\r
+ onig_node_free(cnode);\r
+}\r
+\r
+\r
+enum TokenSyms {\r
+ TK_EOT = 0, /* end of token */\r
+ TK_RAW_BYTE = 1,\r
+ TK_CHAR,\r
+ TK_STRING,\r
+ TK_CODE_POINT,\r
+ TK_ANYCHAR,\r
+ TK_CHAR_TYPE,\r
+ TK_BACKREF,\r
+ TK_CALL,\r
+ TK_ANCHOR,\r
+ TK_OP_REPEAT,\r
+ TK_INTERVAL,\r
+ TK_ANYCHAR_ANYTIME, /* SQL '%' == .* */\r
+ TK_ALT,\r
+ TK_SUBEXP_OPEN,\r
+ TK_SUBEXP_CLOSE,\r
+ TK_CC_OPEN,\r
+ TK_QUOTE_OPEN,\r
+ TK_CHAR_PROPERTY, /* \p{...}, \P{...} */\r
+ /* in cc */\r
+ TK_CC_CLOSE,\r
+ TK_CC_RANGE,\r
+ TK_POSIX_BRACKET_OPEN,\r
+ TK_CC_AND, /* && */\r
+ TK_CC_CC_OPEN /* [ */\r
+};\r
+\r
+typedef struct {\r
+ enum TokenSyms type;\r
+ int escaped;\r
+ int base; /* is number: 8, 16 (used in [....]) */\r
+ UChar* backp;\r
+ union {\r
+ UChar* s;\r
+ int c;\r
+ OnigCodePoint code;\r
+ int anchor;\r
+ int subtype;\r
+ struct {\r
+ int lower;\r
+ int upper;\r
+ int greedy;\r
+ int possessive;\r
+ } repeat;\r
+ struct {\r
+ int num;\r
+ int ref1;\r
+ int* refs;\r
+ int by_name;\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ int exist_level;\r
+ int level; /* \k<name+n> */\r
+#endif\r
+ } backref;\r
+ struct {\r
+ UChar* name;\r
+ UChar* name_end;\r
+ int gnum;\r
+ } call;\r
+ struct {\r
+ int ctype;\r
+ int not;\r
+ } prop;\r
+ } u;\r
+} OnigToken;\r
+\r
+\r
+static int\r
+fetch_range_quantifier(UChar** src, UChar* end, OnigToken* tok, ScanEnv* env)\r
+{\r
+ int low, up, syn_allow, non_low = 0;\r
+ int r = 0;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ syn_allow = IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INVALID_INTERVAL);\r
+\r
+ if (PEND) {\r
+ if (syn_allow)\r
+ return 1; /* "....{" : OK! */\r
+ else\r
+ return ONIGERR_END_PATTERN_AT_LEFT_BRACE; /* "....{" syntax error */\r
+ }\r
+\r
+ if (! syn_allow) {\r
+ c = PPEEK;\r
+ if (c == ')' || c == '(' || c == '|') {\r
+ return ONIGERR_END_PATTERN_AT_LEFT_BRACE;\r
+ }\r
+ }\r
+\r
+ low = onig_scan_unsigned_number(&p, end, env->enc);\r
+ if (low < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\r
+ if (low > ONIG_MAX_REPEAT_NUM)\r
+ return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\r
+\r
+ if (p == *src) { /* can't read low */\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV)) {\r
+ /* allow {,n} as {0,n} */\r
+ low = 0;\r
+ non_low = 1;\r
+ }\r
+ else\r
+ goto invalid;\r
+ }\r
+\r
+ if (PEND) goto invalid;\r
+ PFETCH(c);\r
+ if (c == ',') {\r
+ UChar* prev = p;\r
+ up = onig_scan_unsigned_number(&p, end, env->enc);\r
+ if (up < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\r
+ if (up > ONIG_MAX_REPEAT_NUM)\r
+ return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\r
+\r
+ if (p == prev) {\r
+ if (non_low != 0)\r
+ goto invalid;\r
+ up = REPEAT_INFINITE; /* {n,} : {n,infinite} */\r
+ }\r
+ }\r
+ else {\r
+ if (non_low != 0)\r
+ goto invalid;\r
+\r
+ PUNFETCH;\r
+ up = low; /* {n} : exact n times */\r
+ r = 2; /* fixed */\r
+ }\r
+\r
+ if (PEND) goto invalid;\r
+ PFETCH(c);\r
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) {\r
+ if (c != MC_ESC(env->syntax)) goto invalid;\r
+ PFETCH(c);\r
+ }\r
+ if (c != '}') goto invalid;\r
+\r
+ if (!IS_REPEAT_INFINITE(up) && low > up) {\r
+ return ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE;\r
+ }\r
+\r
+ tok->type = TK_INTERVAL;\r
+ tok->u.repeat.lower = low;\r
+ tok->u.repeat.upper = up;\r
+ *src = p;\r
+ return r; /* 0: normal {n,m}, 2: fixed {n} */\r
+\r
+ invalid:\r
+ if (syn_allow)\r
+ return 1; /* OK */\r
+ else\r
+ return ONIGERR_INVALID_REPEAT_RANGE_PATTERN;\r
+}\r
+\r
+/* \M-, \C-, \c, or \... */\r
+static int\r
+fetch_escaped_value(UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int v;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+ UChar* p = *src;\r
+\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\r
+\r
+ PFETCH_S(c);\r
+ switch (c) {\r
+ case 'M':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META)) {\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_META;\r
+ PFETCH_S(c);\r
+ if (c != '-') return ONIGERR_META_CODE_SYNTAX;\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_META;\r
+ PFETCH_S(c);\r
+ if (c == MC_ESC(env->syntax)) {\r
+ v = fetch_escaped_value(&p, end, env);\r
+ if (v < 0) return v;\r
+ c = (OnigCodePoint )v;\r
+ }\r
+ c = ((c & 0xff) | 0x80);\r
+ }\r
+ else\r
+ goto backslash;\r
+ break;\r
+\r
+ case 'C':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL)) {\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;\r
+ PFETCH_S(c);\r
+ if (c != '-') return ONIGERR_CONTROL_CODE_SYNTAX;\r
+ goto control;\r
+ }\r
+ else\r
+ goto backslash;\r
+\r
+ case 'c':\r
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_C_CONTROL)) {\r
+ control:\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;\r
+ PFETCH_S(c);\r
+ if (c == '?') {\r
+ c = 0177;\r
+ }\r
+ else {\r
+ if (c == MC_ESC(env->syntax)) {\r
+ v = fetch_escaped_value(&p, end, env);\r
+ if (v < 0) return v;\r
+ c = (OnigCodePoint )v;\r
+ }\r
+ c &= 0x9f;\r
+ }\r
+ break;\r
+ }\r
+ /* fall through */\r
+\r
+ default:\r
+ {\r
+ backslash:\r
+ c = conv_backslash_value(c, env);\r
+ }\r
+ break;\r
+ }\r
+\r
+ *src = p;\r
+ return c;\r
+}\r
+\r
+static int fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env);\r
+\r
+static OnigCodePoint\r
+get_name_end_code_point(OnigCodePoint start)\r
+{\r
+ switch (start) {\r
+ case '<': return (OnigCodePoint )'>'; break;\r
+ case '\'': return (OnigCodePoint )'\''; break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return (OnigCodePoint )0;\r
+}\r
+\r
+#ifdef USE_NAMED_GROUP\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+/*\r
+ \k<name+n>, \k<name-n>\r
+ \k<num+n>, \k<num-n>\r
+ \k<-num+n>, \k<-num-n>\r
+*/\r
+static int\r
+fetch_name_with_level(OnigCodePoint start_code, UChar** src, UChar* end,\r
+ UChar** rname_end, ScanEnv* env,\r
+ int* rback_num, int* rlevel)\r
+{\r
+ int r, sign, is_num, exist_level;\r
+ OnigCodePoint end_code;\r
+ OnigCodePoint c = 0;\r
+ OnigEncoding enc = env->enc;\r
+ UChar *name_end;\r
+ UChar *pnum_head;\r
+ UChar *p = *src;\r
+ PFETCH_READY;\r
+\r
+ *rback_num = 0;\r
+ is_num = exist_level = 0;\r
+ sign = 1;\r
+ pnum_head = *src;\r
+\r
+ end_code = get_name_end_code_point(start_code);\r
+\r
+ name_end = end;\r
+ r = 0;\r
+ if (PEND) {\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+ }\r
+ else {\r
+ PFETCH(c);\r
+ if (c == end_code)\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ is_num = 1;\r
+ }\r
+ else if (c == '-') {\r
+ is_num = 2;\r
+ sign = -1;\r
+ pnum_head = p;\r
+ }\r
+ else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ }\r
+\r
+ while (!PEND) {\r
+ name_end = p;\r
+ PFETCH(c);\r
+ if (c == end_code || c == ')' || c == '+' || c == '-') {\r
+ if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME;\r
+ break;\r
+ }\r
+\r
+ if (is_num != 0) {\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ is_num = 1;\r
+ }\r
+ else {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ is_num = 0;\r
+ }\r
+ }\r
+ else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ }\r
+\r
+ if (r == 0 && c != end_code) {\r
+ if (c == '+' || c == '-') {\r
+ int level;\r
+ int flag = (c == '-' ? -1 : 1);\r
+\r
+ PFETCH(c);\r
+ if (! ONIGENC_IS_CODE_DIGIT(enc, c)) goto err;\r
+ PUNFETCH;\r
+ level = onig_scan_unsigned_number(&p, end, enc);\r
+ if (level < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ *rlevel = (level * flag);\r
+ exist_level = 1;\r
+\r
+ PFETCH(c);\r
+ if (c == end_code)\r
+ goto end;\r
+ }\r
+\r
+ err:\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ name_end = end;\r
+ }\r
+\r
+ end:\r
+ if (r == 0) {\r
+ if (is_num != 0) {\r
+ *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\r
+ if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ else if (*rback_num == 0) goto err;\r
+\r
+ *rback_num *= sign;\r
+ }\r
+\r
+ *rname_end = name_end;\r
+ *src = p;\r
+ return (exist_level ? 1 : 0);\r
+ }\r
+ else {\r
+ onig_scan_env_set_error_string(env, r, *src, name_end);\r
+ return r;\r
+ }\r
+}\r
+#endif /* USE_BACKREF_WITH_LEVEL */\r
+\r
+/*\r
+ def: 0 -> define name (don't allow number name)\r
+ 1 -> reference name (allow number name)\r
+*/\r
+static int\r
+fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,\r
+ UChar** rname_end, ScanEnv* env, int* rback_num, int ref)\r
+{\r
+ int r, is_num, sign;\r
+ OnigCodePoint end_code;\r
+ OnigCodePoint c = 0;\r
+ OnigEncoding enc = env->enc;\r
+ UChar *name_end;\r
+ UChar *pnum_head;\r
+ UChar *p = *src;\r
+\r
+ *rback_num = 0;\r
+\r
+ end_code = get_name_end_code_point(start_code);\r
+\r
+ name_end = end;\r
+ pnum_head = *src;\r
+ r = 0;\r
+ is_num = 0;\r
+ sign = 1;\r
+ if (PEND) {\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+ }\r
+ else {\r
+ PFETCH_S(c);\r
+ if (c == end_code)\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ if (ref == 1)\r
+ is_num = 1;\r
+ else {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ is_num = 0;\r
+ }\r
+ }\r
+ else if (c == '-') {\r
+ if (ref == 1) {\r
+ is_num = 2;\r
+ sign = -1;\r
+ pnum_head = p;\r
+ }\r
+ else {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ is_num = 0;\r
+ }\r
+ }\r
+ else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ }\r
+\r
+ if (r == 0) {\r
+ while (!PEND) {\r
+ name_end = p;\r
+ PFETCH_S(c);\r
+ if (c == end_code || c == ')') {\r
+ if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME;\r
+ break;\r
+ }\r
+\r
+ if (is_num != 0) {\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ is_num = 1;\r
+ }\r
+ else {\r
+ if (!ONIGENC_IS_CODE_WORD(enc, c))\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ else\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ is_num = 0;\r
+ }\r
+ }\r
+ else {\r
+ if (!ONIGENC_IS_CODE_WORD(enc, c)) {\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (c != end_code) {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ name_end = end;\r
+ }\r
+\r
+ if (is_num != 0) {\r
+ *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\r
+ if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ else if (*rback_num == 0) {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ goto err;\r
+ }\r
+\r
+ *rback_num *= sign;\r
+ }\r
+\r
+ *rname_end = name_end;\r
+ *src = p;\r
+ return 0;\r
+ }\r
+ else {\r
+ while (!PEND) {\r
+ name_end = p;\r
+ PFETCH_S(c);\r
+ if (c == end_code || c == ')')\r
+ break;\r
+ }\r
+ if (PEND)\r
+ name_end = end;\r
+\r
+ err:\r
+ onig_scan_env_set_error_string(env, r, *src, name_end);\r
+ return r;\r
+ }\r
+}\r
+#else\r
+static int\r
+fetch_name(OnigCodePoint start_code, UChar** src, UChar* end,\r
+ UChar** rname_end, ScanEnv* env, int* rback_num, int ref)\r
+{\r
+ int r, is_num, sign;\r
+ OnigCodePoint end_code;\r
+ OnigCodePoint c = 0;\r
+ UChar *name_end;\r
+ OnigEncoding enc = env->enc;\r
+ UChar *pnum_head;\r
+ UChar *p = *src;\r
+ PFETCH_READY;\r
+\r
+ *rback_num = 0;\r
+\r
+ end_code = get_name_end_code_point(start_code);\r
+\r
+ *rname_end = name_end = end;\r
+ r = 0;\r
+ pnum_head = *src;\r
+ is_num = 0;\r
+ sign = 1;\r
+\r
+ if (PEND) {\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+ }\r
+ else {\r
+ PFETCH(c);\r
+ if (c == end_code)\r
+ return ONIGERR_EMPTY_GROUP_NAME;\r
+\r
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\r
+ is_num = 1;\r
+ }\r
+ else if (c == '-') {\r
+ is_num = 2;\r
+ sign = -1;\r
+ pnum_head = p;\r
+ }\r
+ else {\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ }\r
+\r
+ while (!PEND) {\r
+ name_end = p;\r
+\r
+ PFETCH(c);\r
+ if (c == end_code || c == ')') break;\r
+ if (! ONIGENC_IS_CODE_DIGIT(enc, c))\r
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\r
+ }\r
+ if (r == 0 && c != end_code) {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ name_end = end;\r
+ }\r
+\r
+ if (r == 0) {\r
+ *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\r
+ if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ else if (*rback_num == 0) {\r
+ r = ONIGERR_INVALID_GROUP_NAME;\r
+ goto err;\r
+ }\r
+ *rback_num *= sign;\r
+\r
+ *rname_end = name_end;\r
+ *src = p;\r
+ return 0;\r
+ }\r
+ else {\r
+ err:\r
+ onig_scan_env_set_error_string(env, r, *src, name_end);\r
+ return r;\r
+ }\r
+}\r
+#endif /* USE_NAMED_GROUP */\r
+\r
+static void\r
+CC_ESC_WARN(ScanEnv* env, UChar *c)\r
+{\r
+ if (onig_warn == onig_null_warn) return ;\r
+\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED) &&\r
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC)) {\r
+ UChar buf[WARN_BUFSIZE];\r
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\r
+ env->pattern, env->pattern_end,\r
+ (UChar* )"character class has '%s' without escape", c);\r
+ (*onig_warn)((char* )buf);\r
+ }\r
+}\r
+\r
+static void\r
+CLOSE_BRACKET_WITHOUT_ESC_WARN(ScanEnv* env, UChar* c)\r
+{\r
+ if (onig_warn == onig_null_warn) return ;\r
+\r
+ if (IS_SYNTAX_BV((env)->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED)) {\r
+ UChar buf[WARN_BUFSIZE];\r
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, (env)->enc,\r
+ (env)->pattern, (env)->pattern_end,\r
+ (UChar* )"regular expression has '%s' without escape", c);\r
+ (*onig_warn)((char* )buf);\r
+ }\r
+}\r
+\r
+static UChar*\r
+find_str_position(OnigCodePoint s[], int n, UChar* from, UChar* to,\r
+ UChar **next, OnigEncoding enc)\r
+{\r
+ int i;\r
+ OnigCodePoint x;\r
+ UChar *q;\r
+ UChar *p = from;\r
+ \r
+ while (p < to) {\r
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);\r
+ q = p + enclen(enc, p);\r
+ if (x == s[0]) {\r
+ for (i = 1; i < n && q < to; i++) {\r
+ x = ONIGENC_MBC_TO_CODE(enc, q, to);\r
+ if (x != s[i]) break;\r
+ q += enclen(enc, q);\r
+ }\r
+ if (i >= n) {\r
+ if (IS_NOT_NULL(next))\r
+ *next = q;\r
+ return p;\r
+ }\r
+ }\r
+ p = q;\r
+ }\r
+ return NULL_UCHARP;\r
+}\r
+\r
+static int\r
+str_exist_check_with_esc(OnigCodePoint s[], int n, UChar* from, UChar* to,\r
+ OnigCodePoint bad, OnigEncoding enc, OnigSyntaxType* syn)\r
+{\r
+ int i, in_esc;\r
+ OnigCodePoint x;\r
+ UChar *q;\r
+ UChar *p = from;\r
+\r
+ in_esc = 0;\r
+ while (p < to) {\r
+ if (in_esc) {\r
+ in_esc = 0;\r
+ p += enclen(enc, p);\r
+ }\r
+ else {\r
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);\r
+ q = p + enclen(enc, p);\r
+ if (x == s[0]) {\r
+ for (i = 1; i < n && q < to; i++) {\r
+ x = ONIGENC_MBC_TO_CODE(enc, q, to);\r
+ if (x != s[i]) break;\r
+ q += enclen(enc, q);\r
+ }\r
+ if (i >= n) return 1;\r
+ p += enclen(enc, p);\r
+ }\r
+ else {\r
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);\r
+ if (x == bad) return 0;\r
+ else if (x == MC_ESC(syn)) in_esc = 1;\r
+ p = q;\r
+ }\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+fetch_token_in_cc(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int num;\r
+ OnigCodePoint c, c2;\r
+ OnigSyntaxType* syn = env->syntax;\r
+ OnigEncoding enc = env->enc;\r
+ UChar* prev;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ if (PEND) {\r
+ tok->type = TK_EOT;\r
+ return tok->type;\r
+ }\r
+\r
+ PFETCH(c);\r
+ tok->type = TK_CHAR;\r
+ tok->base = 0;\r
+ tok->u.c = c;\r
+ tok->escaped = 0;\r
+\r
+ if (c == ']') {\r
+ tok->type = TK_CC_CLOSE;\r
+ }\r
+ else if (c == '-') {\r
+ tok->type = TK_CC_RANGE;\r
+ }\r
+ else if (c == MC_ESC(syn)) {\r
+ if (! IS_SYNTAX_BV(syn, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC))\r
+ goto end;\r
+\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\r
+\r
+ PFETCH(c);\r
+ tok->escaped = 1;\r
+ tok->u.c = c;\r
+ switch (c) {\r
+ case 'w':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+ case 'W':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+ case 'd':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+ case 'D':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+ case 's':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+ case 'S':\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+ case 'h':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+ case 'H':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+\r
+ case 'p':\r
+ case 'P':\r
+ c2 = PPEEK;\r
+ if (c2 == '{' &&\r
+ IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY)) {\r
+ PINC;\r
+ tok->type = TK_CHAR_PROPERTY;\r
+ tok->u.prop.not = (c == 'P' ? 1 : 0);\r
+\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT)) {\r
+ PFETCH(c2);\r
+ if (c2 == '^') {\r
+ tok->u.prop.not = (tok->u.prop.not == 0 ? 1 : 0);\r
+ }\r
+ else\r
+ PUNFETCH;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case 'x':\r
+ if (PEND) break;\r
+\r
+ prev = p;\r
+ if (PPEEK_IS('{') && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {\r
+ PINC;\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 8, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;\r
+ if (!PEND) {\r
+ c2 = PPEEK;\r
+ if (ONIGENC_IS_CODE_XDIGIT(enc, c2))\r
+ return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;\r
+ }\r
+\r
+ if (p > prev + enclen(enc, prev) && !PEND && (PPEEK_IS('}'))) {\r
+ PINC;\r
+ tok->type = TK_CODE_POINT;\r
+ tok->base = 16;\r
+ tok->u.code = (OnigCodePoint )num;\r
+ }\r
+ else {\r
+ /* can't read nothing or invalid format */\r
+ p = prev;\r
+ }\r
+ }\r
+ else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 2, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_RAW_BYTE;\r
+ tok->base = 16;\r
+ tok->u.c = num;\r
+ }\r
+ break;\r
+\r
+ case 'u':\r
+ if (PEND) break;\r
+\r
+ prev = p;\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 4, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_CODE_POINT;\r
+ tok->base = 16;\r
+ tok->u.code = (OnigCodePoint )num;\r
+ }\r
+ break;\r
+\r
+ case '0':\r
+ case '1': case '2': case '3': case '4': case '5': case '6': case '7':\r
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {\r
+ PUNFETCH;\r
+ prev = p;\r
+ num = scan_unsigned_octal_number(&p, end, 3, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_RAW_BYTE;\r
+ tok->base = 8;\r
+ tok->u.c = num;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ PUNFETCH;\r
+ num = fetch_escaped_value(&p, end, env);\r
+ if (num < 0) return num;\r
+ if (tok->u.c != num) {\r
+ tok->u.code = (OnigCodePoint )num;\r
+ tok->type = TK_CODE_POINT;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ else if (c == '[') {\r
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_POSIX_BRACKET) && (PPEEK_IS(':'))) {\r
+ OnigCodePoint send[] = { (OnigCodePoint )':', (OnigCodePoint )']' };\r
+ tok->backp = p; /* point at '[' is readed */\r
+ PINC;\r
+ if (str_exist_check_with_esc(send, 2, p, end,\r
+ (OnigCodePoint )']', enc, syn)) {\r
+ tok->type = TK_POSIX_BRACKET_OPEN;\r
+ }\r
+ else {\r
+ PUNFETCH;\r
+ goto cc_in_cc;\r
+ }\r
+ }\r
+ else {\r
+ cc_in_cc:\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP)) {\r
+ tok->type = TK_CC_CC_OPEN;\r
+ }\r
+ else {\r
+ CC_ESC_WARN(env, (UChar* )"[");\r
+ }\r
+ }\r
+ }\r
+ else if (c == '&') {\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP) &&\r
+ !PEND && (PPEEK_IS('&'))) {\r
+ PINC;\r
+ tok->type = TK_CC_AND;\r
+ }\r
+ }\r
+\r
+ end:\r
+ *src = p;\r
+ return tok->type;\r
+}\r
+\r
+static int\r
+fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r, num;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+ OnigSyntaxType* syn = env->syntax;\r
+ UChar* prev;\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ start:\r
+ if (PEND) {\r
+ tok->type = TK_EOT;\r
+ return tok->type;\r
+ }\r
+\r
+ tok->type = TK_STRING;\r
+ tok->base = 0;\r
+ tok->backp = p;\r
+\r
+ PFETCH(c);\r
+ if (IS_MC_ESC_CODE(c, syn)) {\r
+ if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\r
+\r
+ tok->backp = p;\r
+ PFETCH(c);\r
+\r
+ tok->u.c = c;\r
+ tok->escaped = 1;\r
+ switch (c) {\r
+ case '*':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF)) break;\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 0;\r
+ tok->u.repeat.upper = REPEAT_INFINITE;\r
+ goto greedy_check;\r
+ break;\r
+\r
+ case '+':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_PLUS_ONE_INF)) break;\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 1;\r
+ tok->u.repeat.upper = REPEAT_INFINITE;\r
+ goto greedy_check;\r
+ break;\r
+\r
+ case '?':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_QMARK_ZERO_ONE)) break;\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 0;\r
+ tok->u.repeat.upper = 1;\r
+ greedy_check:\r
+ if (!PEND && PPEEK_IS('?') &&\r
+ IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_NON_GREEDY)) {\r
+ PFETCH(c);\r
+ tok->u.repeat.greedy = 0;\r
+ tok->u.repeat.possessive = 0;\r
+ }\r
+ else {\r
+ possessive_check:\r
+ if (!PEND && PPEEK_IS('+') &&\r
+ ((IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT) &&\r
+ tok->type != TK_INTERVAL) ||\r
+ (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL) &&\r
+ tok->type == TK_INTERVAL))) {\r
+ PFETCH(c);\r
+ tok->u.repeat.greedy = 1;\r
+ tok->u.repeat.possessive = 1;\r
+ }\r
+ else {\r
+ tok->u.repeat.greedy = 1;\r
+ tok->u.repeat.possessive = 0;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case '{':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) break;\r
+ r = fetch_range_quantifier(&p, end, tok, env);\r
+ if (r < 0) return r; /* error */\r
+ if (r == 0) goto greedy_check;\r
+ else if (r == 2) { /* {n} */\r
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY))\r
+ goto possessive_check;\r
+\r
+ goto greedy_check;\r
+ }\r
+ /* r == 1 : normal char */\r
+ break;\r
+\r
+ case '|':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_VBAR_ALT)) break;\r
+ tok->type = TK_ALT;\r
+ break;\r
+\r
+ case '(':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;\r
+ tok->type = TK_SUBEXP_OPEN;\r
+ break;\r
+\r
+ case ')':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;\r
+ tok->type = TK_SUBEXP_CLOSE;\r
+ break;\r
+\r
+ case 'w':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+\r
+ case 'W':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+\r
+ case 'b':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.anchor = ANCHOR_WORD_BOUND;\r
+ break;\r
+\r
+ case 'B':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.anchor = ANCHOR_NOT_WORD_BOUND;\r
+ break;\r
+\r
+#ifdef USE_WORD_BEGIN_END\r
+ case '<':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.anchor = ANCHOR_WORD_BEGIN;\r
+ break;\r
+\r
+ case '>':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.anchor = ANCHOR_WORD_END;\r
+ break;\r
+#endif\r
+\r
+ case 's':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+\r
+ case 'S':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+\r
+ case 'd':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+\r
+ case 'D':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+\r
+ case 'h':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\r
+ tok->u.prop.not = 0;\r
+ break;\r
+\r
+ case 'H':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\r
+ tok->type = TK_CHAR_TYPE;\r
+ tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\r
+ tok->u.prop.not = 1;\r
+ break;\r
+\r
+ case 'A':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\r
+ begin_buf:\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = ANCHOR_BEGIN_BUF;\r
+ break;\r
+\r
+ case 'Z':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = ANCHOR_SEMI_END_BUF;\r
+ break;\r
+\r
+ case 'z':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\r
+ end_buf:\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = ANCHOR_END_BUF;\r
+ break;\r
+\r
+ case 'G':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = ANCHOR_BEGIN_POSITION;\r
+ break;\r
+\r
+ case '`':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;\r
+ goto begin_buf;\r
+ break;\r
+\r
+ case '\'':\r
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;\r
+ goto end_buf;\r
+ break;\r
+\r
+ case 'x':\r
+ if (PEND) break;\r
+\r
+ prev = p;\r
+ if (PPEEK_IS('{') && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {\r
+ PINC;\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 8, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;\r
+ if (!PEND) {\r
+ if (ONIGENC_IS_CODE_XDIGIT(enc, PPEEK))\r
+ return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;\r
+ }\r
+\r
+ if ((p > prev + enclen(enc, prev)) && !PEND && PPEEK_IS('}')) {\r
+ PINC;\r
+ tok->type = TK_CODE_POINT;\r
+ tok->u.code = (OnigCodePoint )num;\r
+ }\r
+ else {\r
+ /* can't read nothing or invalid format */\r
+ p = prev;\r
+ }\r
+ }\r
+ else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 2, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_RAW_BYTE;\r
+ tok->base = 16;\r
+ tok->u.c = num;\r
+ }\r
+ break;\r
+\r
+ case 'u':\r
+ if (PEND) break;\r
+\r
+ prev = p;\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {\r
+ num = scan_unsigned_hexadecimal_number(&p, end, 4, enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_CODE_POINT;\r
+ tok->base = 16;\r
+ tok->u.code = (OnigCodePoint )num;\r
+ }\r
+ break;\r
+\r
+ case '1': case '2': case '3': case '4':\r
+ case '5': case '6': case '7': case '8': case '9':\r
+ PUNFETCH;\r
+ prev = p;\r
+ num = onig_scan_unsigned_number(&p, end, enc);\r
+ if (num < 0 || num > ONIG_MAX_BACKREF_NUM) {\r
+ goto skip_backref;\r
+ }\r
+\r
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_DECIMAL_BACKREF) && \r
+ (num <= env->num_mem || num <= 9)) { /* This spec. from GNU regex */\r
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\r
+ if (num > env->num_mem || IS_NULL(SCANENV_MEM_NODES(env)[num]))\r
+ return ONIGERR_INVALID_BACKREF;\r
+ }\r
+\r
+ tok->type = TK_BACKREF;\r
+ tok->u.backref.num = 1;\r
+ tok->u.backref.ref1 = num;\r
+ tok->u.backref.by_name = 0;\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ tok->u.backref.exist_level = 0;\r
+#endif\r
+ break;\r
+ }\r
+\r
+ skip_backref:\r
+ if (c == '8' || c == '9') {\r
+ /* normal char */\r
+ p = prev; PINC;\r
+ break;\r
+ }\r
+\r
+ p = prev;\r
+ /* fall through */\r
+ case '0':\r
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {\r
+ prev = p;\r
+ num = scan_unsigned_octal_number(&p, end, (c == '0' ? 2:3), enc);\r
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\r
+ if (p == prev) { /* can't read nothing. */\r
+ num = 0; /* but, it's not error */\r
+ }\r
+ tok->type = TK_RAW_BYTE;\r
+ tok->base = 8;\r
+ tok->u.c = num;\r
+ }\r
+ else if (c != '0') {\r
+ PINC;\r
+ }\r
+ break;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ case 'k':\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_K_NAMED_BACKREF)) {\r
+ PFETCH(c);\r
+ if (c == '<' || c == '\'') {\r
+ UChar* name_end;\r
+ int* backs;\r
+ int back_num;\r
+\r
+ prev = p;\r
+\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ name_end = NULL_UCHARP; /* no need. escape gcc warning. */\r
+ r = fetch_name_with_level((OnigCodePoint )c, &p, end, &name_end,\r
+ env, &back_num, &tok->u.backref.level);\r
+ if (r == 1) tok->u.backref.exist_level = 1;\r
+ else tok->u.backref.exist_level = 0;\r
+#else\r
+ r = fetch_name(&p, end, &name_end, env, &back_num, 1);\r
+#endif\r
+ if (r < 0) return r;\r
+\r
+ if (back_num != 0) {\r
+ if (back_num < 0) {\r
+ back_num = BACKREF_REL_TO_ABS(back_num, env);\r
+ if (back_num <= 0)\r
+ return ONIGERR_INVALID_BACKREF;\r
+ }\r
+\r
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\r
+ if (back_num > env->num_mem ||\r
+ IS_NULL(SCANENV_MEM_NODES(env)[back_num]))\r
+ return ONIGERR_INVALID_BACKREF;\r
+ }\r
+ tok->type = TK_BACKREF;\r
+ tok->u.backref.by_name = 0;\r
+ tok->u.backref.num = 1;\r
+ tok->u.backref.ref1 = back_num;\r
+ }\r
+ else {\r
+ num = onig_name_to_group_numbers(env->reg, prev, name_end, &backs);\r
+ if (num <= 0) {\r
+ onig_scan_env_set_error_string(env,\r
+ ONIGERR_UNDEFINED_NAME_REFERENCE, prev, name_end);\r
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;\r
+ }\r
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\r
+ int i;\r
+ for (i = 0; i < num; i++) {\r
+ if (backs[i] > env->num_mem ||\r
+ IS_NULL(SCANENV_MEM_NODES(env)[backs[i]]))\r
+ return ONIGERR_INVALID_BACKREF;\r
+ }\r
+ }\r
+\r
+ tok->type = TK_BACKREF;\r
+ tok->u.backref.by_name = 1;\r
+ if (num == 1) {\r
+ tok->u.backref.num = 1;\r
+ tok->u.backref.ref1 = backs[0];\r
+ }\r
+ else {\r
+ tok->u.backref.num = num;\r
+ tok->u.backref.refs = backs;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ PUNFETCH;\r
+ }\r
+ break;\r
+#endif\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case 'g':\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_G_SUBEXP_CALL)) {\r
+ PFETCH(c);\r
+ if (c == '<' || c == '\'') {\r
+ int gnum;\r
+ UChar* name_end;\r
+\r
+ prev = p;\r
+ r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &gnum, 1);\r
+ if (r < 0) return r;\r
+\r
+ tok->type = TK_CALL;\r
+ tok->u.call.name = prev;\r
+ tok->u.call.name_end = name_end;\r
+ tok->u.call.gnum = gnum;\r
+ }\r
+ else\r
+ PUNFETCH;\r
+ }\r
+ break;\r
+#endif\r
+\r
+ case 'Q':\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE)) {\r
+ tok->type = TK_QUOTE_OPEN;\r
+ }\r
+ break;\r
+\r
+ case 'p':\r
+ case 'P':\r
+ if (PPEEK_IS('{') &&\r
+ IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY)) {\r
+ PINC;\r
+ tok->type = TK_CHAR_PROPERTY;\r
+ tok->u.prop.not = (c == 'P' ? 1 : 0);\r
+\r
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT)) {\r
+ PFETCH(c);\r
+ if (c == '^') {\r
+ tok->u.prop.not = (tok->u.prop.not == 0 ? 1 : 0);\r
+ }\r
+ else\r
+ PUNFETCH;\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ PUNFETCH;\r
+ num = fetch_escaped_value(&p, end, env);\r
+ if (num < 0) return num;\r
+ /* set_raw: */\r
+ if (tok->u.c != num) {\r
+ tok->type = TK_CODE_POINT;\r
+ tok->u.code = (OnigCodePoint )num;\r
+ }\r
+ else { /* string */\r
+ p = tok->backp + enclen(enc, tok->backp);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ tok->u.c = c;\r
+ tok->escaped = 0;\r
+\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ if ((c != ONIG_INEFFECTIVE_META_CHAR) &&\r
+ IS_SYNTAX_OP(syn, ONIG_SYN_OP_VARIABLE_META_CHARACTERS)) {\r
+ if (c == MC_ANYCHAR(syn))\r
+ goto any_char;\r
+ else if (c == MC_ANYTIME(syn))\r
+ goto anytime;\r
+ else if (c == MC_ZERO_OR_ONE_TIME(syn))\r
+ goto zero_or_one_time;\r
+ else if (c == MC_ONE_OR_MORE_TIME(syn))\r
+ goto one_or_more_time;\r
+ else if (c == MC_ANYCHAR_ANYTIME(syn)) {\r
+ tok->type = TK_ANYCHAR_ANYTIME;\r
+ goto out;\r
+ }\r
+ }\r
+#endif\r
+\r
+ switch (c) {\r
+ case '.':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_DOT_ANYCHAR)) break;\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ any_char:\r
+#endif\r
+ tok->type = TK_ANYCHAR;\r
+ break;\r
+\r
+ case '*':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ASTERISK_ZERO_INF)) break;\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ anytime:\r
+#endif\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 0;\r
+ tok->u.repeat.upper = REPEAT_INFINITE;\r
+ goto greedy_check;\r
+ break;\r
+\r
+ case '+':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_PLUS_ONE_INF)) break;\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ one_or_more_time:\r
+#endif\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 1;\r
+ tok->u.repeat.upper = REPEAT_INFINITE;\r
+ goto greedy_check;\r
+ break;\r
+\r
+ case '?':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_ZERO_ONE)) break;\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ zero_or_one_time:\r
+#endif\r
+ tok->type = TK_OP_REPEAT;\r
+ tok->u.repeat.lower = 0;\r
+ tok->u.repeat.upper = 1;\r
+ goto greedy_check;\r
+ break;\r
+\r
+ case '{':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACE_INTERVAL)) break;\r
+ r = fetch_range_quantifier(&p, end, tok, env);\r
+ if (r < 0) return r; /* error */\r
+ if (r == 0) goto greedy_check;\r
+ else if (r == 2) { /* {n} */\r
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY))\r
+ goto possessive_check;\r
+\r
+ goto greedy_check;\r
+ }\r
+ /* r == 1 : normal char */\r
+ break;\r
+\r
+ case '|':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_VBAR_ALT)) break;\r
+ tok->type = TK_ALT;\r
+ break;\r
+\r
+ case '(':\r
+ if (PPEEK_IS('?') &&\r
+ IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_QMARK_GROUP_EFFECT)) {\r
+ PINC;\r
+ if (PPEEK_IS('#')) {\r
+ PFETCH(c);\r
+ while (1) {\r
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\r
+ PFETCH(c);\r
+ if (c == MC_ESC(syn)) {\r
+ if (!PEND) PFETCH(c);\r
+ }\r
+ else {\r
+ if (c == ')') break;\r
+ }\r
+ }\r
+ goto start;\r
+ }\r
+ PUNFETCH;\r
+ }\r
+\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;\r
+ tok->type = TK_SUBEXP_OPEN;\r
+ break;\r
+\r
+ case ')':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;\r
+ tok->type = TK_SUBEXP_CLOSE;\r
+ break;\r
+\r
+ case '^':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = (IS_SINGLELINE(env->option)\r
+ ? ANCHOR_BEGIN_BUF : ANCHOR_BEGIN_LINE);\r
+ break;\r
+\r
+ case '$':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;\r
+ tok->type = TK_ANCHOR;\r
+ tok->u.subtype = (IS_SINGLELINE(env->option)\r
+ ? ANCHOR_SEMI_END_BUF : ANCHOR_END_LINE);\r
+ break;\r
+\r
+ case '[':\r
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACKET_CC)) break;\r
+ tok->type = TK_CC_OPEN;\r
+ break;\r
+\r
+ case ']':\r
+ if (*src > env->pattern) /* /].../ is allowed. */\r
+ CLOSE_BRACKET_WITHOUT_ESC_WARN(env, (UChar* )"]");\r
+ break;\r
+\r
+ case '#':\r
+ if (IS_EXTEND(env->option)) {\r
+ while (!PEND) {\r
+ PFETCH(c);\r
+ if (ONIGENC_IS_CODE_NEWLINE(enc, c))\r
+ break;\r
+ }\r
+ goto start;\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case ' ': case '\t': case '\n': case '\r': case '\f':\r
+ if (IS_EXTEND(env->option))\r
+ goto start;\r
+ break;\r
+\r
+ default:\r
+ /* string */\r
+ break;\r
+ }\r
+ }\r
+\r
+#ifdef USE_VARIABLE_META_CHARS\r
+ out:\r
+#endif\r
+ *src = p;\r
+ return tok->type;\r
+}\r
+\r
+static int\r
+add_ctype_to_cc_by_range(CClassNode* cc, int ctype ARG_UNUSED, int not,\r
+ OnigEncoding enc ARG_UNUSED,\r
+ OnigCodePoint sb_out, const OnigCodePoint mbr[])\r
+{\r
+ int i, r;\r
+ OnigCodePoint j;\r
+\r
+ int n = ONIGENC_CODE_RANGE_NUM(mbr);\r
+\r
+ if (not == 0) {\r
+ for (i = 0; i < n; i++) {\r
+ for (j = ONIGENC_CODE_RANGE_FROM(mbr, i);\r
+ j <= ONIGENC_CODE_RANGE_TO(mbr, i); j++) {\r
+ if (j >= sb_out) {\r
+ if (j == ONIGENC_CODE_RANGE_TO(mbr, i)) i++;\r
+ else if (j > ONIGENC_CODE_RANGE_FROM(mbr, i)) {\r
+ r = add_code_range_to_buf(&(cc->mbuf), j,\r
+ ONIGENC_CODE_RANGE_TO(mbr, i));\r
+ if (r != 0) return r;\r
+ i++;\r
+ }\r
+\r
+ goto sb_end;\r
+ }\r
+ BITSET_SET_BIT(cc->bs, j);\r
+ }\r
+ }\r
+\r
+ sb_end:\r
+ for ( ; i < n; i++) {\r
+ r = add_code_range_to_buf(&(cc->mbuf),\r
+ ONIGENC_CODE_RANGE_FROM(mbr, i),\r
+ ONIGENC_CODE_RANGE_TO(mbr, i));\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+ else {\r
+ OnigCodePoint prev = 0;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ for (j = prev;\r
+ j < ONIGENC_CODE_RANGE_FROM(mbr, i); j++) {\r
+ if (j >= sb_out) {\r
+ goto sb_end2;\r
+ }\r
+ BITSET_SET_BIT(cc->bs, j);\r
+ }\r
+ prev = ONIGENC_CODE_RANGE_TO(mbr, i) + 1;\r
+ }\r
+ for (j = prev; j < sb_out; j++) {\r
+ BITSET_SET_BIT(cc->bs, j);\r
+ }\r
+\r
+ sb_end2:\r
+ prev = sb_out;\r
+\r
+ for (i = 0; i < n; i++) {\r
+ if (prev < ONIGENC_CODE_RANGE_FROM(mbr, i)) {\r
+ r = add_code_range_to_buf(&(cc->mbuf), prev,\r
+ ONIGENC_CODE_RANGE_FROM(mbr, i) - 1);\r
+ if (r != 0) return r;\r
+ }\r
+ prev = ONIGENC_CODE_RANGE_TO(mbr, i) + 1;\r
+ }\r
+ if (prev < 0x7fffffff) {\r
+ r = add_code_range_to_buf(&(cc->mbuf), prev, 0x7fffffff);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+add_ctype_to_cc(CClassNode* cc, int ctype, int not, ScanEnv* env)\r
+{\r
+ int c, r;\r
+ const OnigCodePoint *ranges;\r
+ OnigCodePoint sb_out;\r
+ OnigEncoding enc = env->enc;\r
+\r
+ r = ONIGENC_GET_CTYPE_CODE_RANGE(enc, ctype, &sb_out, &ranges);\r
+ if (r == 0) {\r
+ return add_ctype_to_cc_by_range(cc, ctype, not, env->enc, sb_out, ranges);\r
+ }\r
+ else if (r != ONIG_NO_SUPPORT_CONFIG) {\r
+ return r;\r
+ }\r
+\r
+ r = 0;\r
+ switch (ctype) {\r
+ case ONIGENC_CTYPE_ALPHA:\r
+ case ONIGENC_CTYPE_BLANK:\r
+ case ONIGENC_CTYPE_CNTRL:\r
+ case ONIGENC_CTYPE_DIGIT:\r
+ case ONIGENC_CTYPE_LOWER:\r
+ case ONIGENC_CTYPE_PUNCT:\r
+ case ONIGENC_CTYPE_SPACE:\r
+ case ONIGENC_CTYPE_UPPER:\r
+ case ONIGENC_CTYPE_XDIGIT:\r
+ case ONIGENC_CTYPE_ASCII:\r
+ case ONIGENC_CTYPE_ALNUM:\r
+ if (not != 0) {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\r
+ BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\r
+ }\r
+ else {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\r
+ BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ }\r
+ break;\r
+\r
+ case ONIGENC_CTYPE_GRAPH:\r
+ case ONIGENC_CTYPE_PRINT:\r
+ if (not != 0) {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\r
+ BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ }\r
+ else {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\r
+ BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\r
+ }\r
+ break;\r
+\r
+ case ONIGENC_CTYPE_WORD:\r
+ if (not == 0) {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if (IS_CODE_SB_WORD(enc, c)) BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\r
+ }\r
+ else {\r
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\r
+ if ((ONIGENC_CODE_TO_MBCLEN(enc, c) > 0) /* check invalid code point */\r
+ && ! ONIGENC_IS_CODE_WORD(enc, c))\r
+ BITSET_SET_BIT(cc->bs, c);\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_PARSER_BUG;\r
+ break;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+parse_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+#define POSIX_BRACKET_CHECK_LIMIT_LENGTH 20\r
+#define POSIX_BRACKET_NAME_MIN_LEN 4\r
+\r
+ static PosixBracketEntryType PBS[] = {\r
+ { (UChar* )"alnum", ONIGENC_CTYPE_ALNUM, 5 },\r
+ { (UChar* )"alpha", ONIGENC_CTYPE_ALPHA, 5 },\r
+ { (UChar* )"blank", ONIGENC_CTYPE_BLANK, 5 },\r
+ { (UChar* )"cntrl", ONIGENC_CTYPE_CNTRL, 5 },\r
+ { (UChar* )"digit", ONIGENC_CTYPE_DIGIT, 5 },\r
+ { (UChar* )"graph", ONIGENC_CTYPE_GRAPH, 5 },\r
+ { (UChar* )"lower", ONIGENC_CTYPE_LOWER, 5 },\r
+ { (UChar* )"print", ONIGENC_CTYPE_PRINT, 5 },\r
+ { (UChar* )"punct", ONIGENC_CTYPE_PUNCT, 5 },\r
+ { (UChar* )"space", ONIGENC_CTYPE_SPACE, 5 },\r
+ { (UChar* )"upper", ONIGENC_CTYPE_UPPER, 5 },\r
+ { (UChar* )"xdigit", ONIGENC_CTYPE_XDIGIT, 6 },\r
+ { (UChar* )"ascii", ONIGENC_CTYPE_ASCII, 5 },\r
+ { (UChar* )"word", ONIGENC_CTYPE_WORD, 4 },\r
+ { (UChar* )NULL, -1, 0 }\r
+ };\r
+\r
+ PosixBracketEntryType *pb;\r
+ int not, i, r;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+ UChar *p = *src;\r
+\r
+ if (PPEEK_IS('^')) {\r
+ PINC_S;\r
+ not = 1;\r
+ }\r
+ else\r
+ not = 0;\r
+\r
+ if (onigenc_strlen(enc, p, end) < POSIX_BRACKET_NAME_MIN_LEN + 3)\r
+ goto not_posix_bracket;\r
+\r
+ for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {\r
+ if (onigenc_with_ascii_strncmp(enc, p, end, pb->name, pb->len) == 0) {\r
+ p = (UChar* )onigenc_step(enc, p, end, pb->len);\r
+ if (onigenc_with_ascii_strncmp(enc, p, end, (UChar* )":]", 2) != 0)\r
+ return ONIGERR_INVALID_POSIX_BRACKET_TYPE;\r
+\r
+ r = add_ctype_to_cc(cc, pb->ctype, not, env);\r
+ if (r != 0) return r;\r
+\r
+ PINC_S; PINC_S;\r
+ *src = p;\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ not_posix_bracket:\r
+ c = 0;\r
+ i = 0;\r
+ while (!PEND && ((c = PPEEK) != ':') && c != ']') {\r
+ PINC_S;\r
+ if (++i > POSIX_BRACKET_CHECK_LIMIT_LENGTH) break;\r
+ }\r
+ if (c == ':' && ! PEND) {\r
+ PINC_S;\r
+ if (! PEND) {\r
+ PFETCH_S(c);\r
+ if (c == ']')\r
+ return ONIGERR_INVALID_POSIX_BRACKET_TYPE;\r
+ }\r
+ }\r
+\r
+ return 1; /* 1: is not POSIX bracket, but no error. */\r
+}\r
+\r
+static int\r
+fetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+ UChar *prev, *start, *p = *src;\r
+\r
+ r = 0;\r
+ start = prev = p;\r
+\r
+ while (!PEND) {\r
+ prev = p;\r
+ PFETCH_S(c);\r
+ if (c == '}') {\r
+ r = ONIGENC_PROPERTY_NAME_TO_CTYPE(enc, start, prev);\r
+ if (r < 0) break;\r
+\r
+ *src = p;\r
+ return r;\r
+ }\r
+ else if (c == '(' || c == ')' || c == '{' || c == '|') {\r
+ r = ONIGERR_INVALID_CHAR_PROPERTY_NAME;\r
+ break;\r
+ }\r
+ }\r
+\r
+ onig_scan_env_set_error_string(env, r, *src, prev);\r
+ return r;\r
+}\r
+\r
+static int\r
+parse_char_property(Node** np, OnigToken* tok, UChar** src, UChar* end,\r
+ ScanEnv* env)\r
+{\r
+ int r, ctype;\r
+ CClassNode* cc;\r
+\r
+ ctype = fetch_char_property_to_ctype(src, end, env);\r
+ if (ctype < 0) return ctype;\r
+\r
+ *np = node_new_cclass();\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ cc = NCCLASS(*np);\r
+ r = add_ctype_to_cc(cc, ctype, 0, env);\r
+ if (r != 0) return r;\r
+ if (tok->u.prop.not != 0) NCCLASS_SET_NOT(cc);\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+enum CCSTATE {\r
+ CCS_VALUE,\r
+ CCS_RANGE,\r
+ CCS_COMPLETE,\r
+ CCS_START\r
+};\r
+\r
+enum CCVALTYPE {\r
+ CCV_SB,\r
+ CCV_CODE_POINT,\r
+ CCV_CLASS\r
+};\r
+\r
+static int\r
+next_state_class(CClassNode* cc, OnigCodePoint* vs, enum CCVALTYPE* type,\r
+ enum CCSTATE* state, ScanEnv* env)\r
+{\r
+ int r;\r
+\r
+ if (*state == CCS_RANGE)\r
+ return ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE;\r
+\r
+ if (*state == CCS_VALUE && *type != CCV_CLASS) {\r
+ if (*type == CCV_SB)\r
+ BITSET_SET_BIT(cc->bs, (int )(*vs));\r
+ else if (*type == CCV_CODE_POINT) {\r
+ r = add_code_range(&(cc->mbuf), env, *vs, *vs);\r
+ if (r < 0) return r;\r
+ }\r
+ }\r
+\r
+ *state = CCS_VALUE;\r
+ *type = CCV_CLASS;\r
+ return 0;\r
+}\r
+\r
+static int\r
+next_state_val(CClassNode* cc, OnigCodePoint *vs, OnigCodePoint v,\r
+ int* vs_israw, int v_israw,\r
+ enum CCVALTYPE intype, enum CCVALTYPE* type,\r
+ enum CCSTATE* state, ScanEnv* env)\r
+{\r
+ int r;\r
+\r
+ switch (*state) {\r
+ case CCS_VALUE:\r
+ if (*type == CCV_SB)\r
+ BITSET_SET_BIT(cc->bs, (int )(*vs));\r
+ else if (*type == CCV_CODE_POINT) {\r
+ r = add_code_range(&(cc->mbuf), env, *vs, *vs);\r
+ if (r < 0) return r;\r
+ }\r
+ break;\r
+\r
+ case CCS_RANGE:\r
+ if (intype == *type) {\r
+ if (intype == CCV_SB) {\r
+ if (*vs > 0xff || v > 0xff)\r
+ return ONIGERR_INVALID_CODE_POINT_VALUE;\r
+\r
+ if (*vs > v) {\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\r
+ goto ccs_range_end;\r
+ else\r
+ return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\r
+ }\r
+ bitset_set_range(cc->bs, (int )*vs, (int )v);\r
+ }\r
+ else {\r
+ r = add_code_range(&(cc->mbuf), env, *vs, v);\r
+ if (r < 0) return r;\r
+ }\r
+ }\r
+ else {\r
+#if 0\r
+ if (intype == CCV_CODE_POINT && *type == CCV_SB) {\r
+#endif\r
+ if (*vs > v) {\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\r
+ goto ccs_range_end;\r
+ else\r
+ return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\r
+ }\r
+ bitset_set_range(cc->bs, (int )*vs, (int )(v < 0xff ? v : 0xff));\r
+ r = add_code_range(&(cc->mbuf), env, (OnigCodePoint )*vs, v);\r
+ if (r < 0) return r;\r
+#if 0\r
+ }\r
+ else\r
+ return ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE;\r
+#endif\r
+ }\r
+ ccs_range_end:\r
+ *state = CCS_COMPLETE;\r
+ break;\r
+\r
+ case CCS_COMPLETE:\r
+ case CCS_START:\r
+ *state = CCS_VALUE;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ *vs_israw = v_israw;\r
+ *vs = v;\r
+ *type = intype;\r
+ return 0;\r
+}\r
+\r
+static int\r
+code_exist_check(OnigCodePoint c, UChar* from, UChar* end, int ignore_escaped,\r
+ ScanEnv* env)\r
+{\r
+ int in_esc;\r
+ OnigCodePoint code;\r
+ OnigEncoding enc = env->enc;\r
+ UChar* p = from;\r
+\r
+ in_esc = 0;\r
+ while (! PEND) {\r
+ if (ignore_escaped && in_esc) {\r
+ in_esc = 0;\r
+ }\r
+ else {\r
+ PFETCH_S(code);\r
+ if (code == c) return 1;\r
+ if (code == MC_ESC(env->syntax)) in_esc = 1;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+parse_char_class(Node** np, OnigToken* tok, UChar** src, UChar* end,\r
+ ScanEnv* env)\r
+{\r
+ int r, neg, len, fetched, and_start;\r
+ OnigCodePoint v, vs;\r
+ UChar *p;\r
+ Node* node;\r
+ CClassNode *cc, *prev_cc;\r
+ CClassNode work_cc;\r
+\r
+ enum CCSTATE state;\r
+ enum CCVALTYPE val_type, in_type;\r
+ int val_israw, in_israw;\r
+\r
+ prev_cc = (CClassNode* )NULL;\r
+ *np = NULL_NODE;\r
+ r = fetch_token_in_cc(tok, src, end, env);\r
+ if (r == TK_CHAR && tok->u.c == '^' && tok->escaped == 0) {\r
+ neg = 1;\r
+ r = fetch_token_in_cc(tok, src, end, env);\r
+ }\r
+ else {\r
+ neg = 0;\r
+ }\r
+\r
+ if (r < 0) return r;\r
+ if (r == TK_CC_CLOSE) {\r
+ if (! code_exist_check((OnigCodePoint )']',\r
+ *src, env->pattern_end, 1, env))\r
+ return ONIGERR_EMPTY_CHAR_CLASS;\r
+\r
+ CC_ESC_WARN(env, (UChar* )"]");\r
+ r = tok->type = TK_CHAR; /* allow []...] */\r
+ }\r
+\r
+ *np = node = node_new_cclass();\r
+ CHECK_NULL_RETURN_MEMERR(node);\r
+ cc = NCCLASS(node);\r
+\r
+ and_start = 0;\r
+ state = CCS_START;\r
+ p = *src;\r
+ while (r != TK_CC_CLOSE) {\r
+ fetched = 0;\r
+ switch (r) {\r
+ case TK_CHAR:\r
+ len = ONIGENC_CODE_TO_MBCLEN(env->enc, tok->u.c);\r
+ if (len > 1) {\r
+ in_type = CCV_CODE_POINT;\r
+ }\r
+ else if (len < 0) {\r
+ r = len;\r
+ goto err;\r
+ }\r
+ else {\r
+ sb_char:\r
+ in_type = CCV_SB;\r
+ }\r
+ v = (OnigCodePoint )tok->u.c;\r
+ in_israw = 0;\r
+ goto val_entry2;\r
+ break;\r
+\r
+ case TK_RAW_BYTE:\r
+ /* tok->base != 0 : octal or hexadec. */\r
+ if (! ONIGENC_IS_SINGLEBYTE(env->enc) && tok->base != 0) {\r
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\r
+ UChar* bufe = buf + ONIGENC_CODE_TO_MBC_MAXLEN;\r
+ UChar* psave = p;\r
+ int i, base = tok->base;\r
+\r
+ buf[0] = (UChar)tok->u.c;\r
+ for (i = 1; i < ONIGENC_MBC_MAXLEN(env->enc); i++) {\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ if (r < 0) goto err;\r
+ if (r != TK_RAW_BYTE || tok->base != base) {\r
+ fetched = 1;\r
+ break;\r
+ }\r
+ buf[i] = (UChar)tok->u.c;\r
+ }\r
+\r
+ if (i < ONIGENC_MBC_MINLEN(env->enc)) {\r
+ r = ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\r
+ goto err;\r
+ }\r
+\r
+ len = enclen(env->enc, buf);\r
+ if (i < len) {\r
+ r = ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\r
+ goto err;\r
+ }\r
+ else if (i > len) { /* fetch back */\r
+ p = psave;\r
+ for (i = 1; i < len; i++) {\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ }\r
+ fetched = 0;\r
+ }\r
+\r
+ if (i == 1) {\r
+ v = (OnigCodePoint )buf[0];\r
+ goto raw_single;\r
+ }\r
+ else {\r
+ v = ONIGENC_MBC_TO_CODE(env->enc, buf, bufe);\r
+ in_type = CCV_CODE_POINT;\r
+ }\r
+ }\r
+ else {\r
+ v = (OnigCodePoint )tok->u.c;\r
+ raw_single:\r
+ in_type = CCV_SB;\r
+ }\r
+ in_israw = 1;\r
+ goto val_entry2;\r
+ break;\r
+\r
+ case TK_CODE_POINT:\r
+ v = tok->u.code;\r
+ in_israw = 1;\r
+ val_entry:\r
+ len = ONIGENC_CODE_TO_MBCLEN(env->enc, v);\r
+ if (len < 0) {\r
+ r = len;\r
+ goto err;\r
+ }\r
+ in_type = (len == 1 ? CCV_SB : CCV_CODE_POINT);\r
+ val_entry2:\r
+ r = next_state_val(cc, &vs, v, &val_israw, in_israw, in_type, &val_type,\r
+ &state, env);\r
+ if (r != 0) goto err;\r
+ break;\r
+\r
+ case TK_POSIX_BRACKET_OPEN:\r
+ r = parse_posix_bracket(cc, &p, end, env);\r
+ if (r < 0) goto err;\r
+ if (r == 1) { /* is not POSIX bracket */\r
+ CC_ESC_WARN(env, (UChar* )"[");\r
+ p = tok->backp;\r
+ v = (OnigCodePoint )tok->u.c;\r
+ in_israw = 0;\r
+ goto val_entry;\r
+ }\r
+ goto next_class;\r
+ break;\r
+\r
+ case TK_CHAR_TYPE:\r
+ r = add_ctype_to_cc(cc, tok->u.prop.ctype, tok->u.prop.not, env);\r
+ if (r != 0) return r;\r
+\r
+ next_class:\r
+ r = next_state_class(cc, &vs, &val_type, &state, env);\r
+ if (r != 0) goto err;\r
+ break;\r
+\r
+ case TK_CHAR_PROPERTY:\r
+ {\r
+ int ctype;\r
+\r
+ ctype = fetch_char_property_to_ctype(&p, end, env);\r
+ if (ctype < 0) return ctype;\r
+ r = add_ctype_to_cc(cc, ctype, tok->u.prop.not, env);\r
+ if (r != 0) return r;\r
+ goto next_class;\r
+ }\r
+ break;\r
+\r
+ case TK_CC_RANGE:\r
+ if (state == CCS_VALUE) {\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ if (r < 0) goto err;\r
+ fetched = 1;\r
+ if (r == TK_CC_CLOSE) { /* allow [x-] */\r
+ range_end_val:\r
+ v = (OnigCodePoint )'-';\r
+ in_israw = 0;\r
+ goto val_entry;\r
+ }\r
+ else if (r == TK_CC_AND) {\r
+ CC_ESC_WARN(env, (UChar* )"-");\r
+ goto range_end_val;\r
+ }\r
+ state = CCS_RANGE;\r
+ }\r
+ else if (state == CCS_START) {\r
+ /* [-xa] is allowed */\r
+ v = (OnigCodePoint )tok->u.c;\r
+ in_israw = 0;\r
+\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ if (r < 0) goto err;\r
+ fetched = 1;\r
+ /* [--x] or [a&&-x] is warned. */\r
+ if (r == TK_CC_RANGE || and_start != 0)\r
+ CC_ESC_WARN(env, (UChar* )"-");\r
+\r
+ goto val_entry;\r
+ }\r
+ else if (state == CCS_RANGE) {\r
+ CC_ESC_WARN(env, (UChar* )"-");\r
+ goto sb_char; /* [!--x] is allowed */\r
+ }\r
+ else { /* CCS_COMPLETE */\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ if (r < 0) goto err;\r
+ fetched = 1;\r
+ if (r == TK_CC_CLOSE) goto range_end_val; /* allow [a-b-] */\r
+ else if (r == TK_CC_AND) {\r
+ CC_ESC_WARN(env, (UChar* )"-");\r
+ goto range_end_val;\r
+ }\r
+ \r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC)) {\r
+ CC_ESC_WARN(env, (UChar* )"-");\r
+ goto sb_char; /* [0-9-a] is allowed as [0-9\-a] */\r
+ }\r
+ r = ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS;\r
+ goto err;\r
+ }\r
+ break;\r
+\r
+ case TK_CC_CC_OPEN: /* [ */\r
+ {\r
+ Node *anode;\r
+ CClassNode* acc;\r
+\r
+ r = parse_char_class(&anode, tok, &p, end, env);\r
+ if (r != 0) goto cc_open_err;\r
+ acc = NCCLASS(anode);\r
+ r = or_cclass(cc, acc, env->enc);\r
+\r
+ onig_node_free(anode);\r
+ cc_open_err:\r
+ if (r != 0) goto err;\r
+ }\r
+ break;\r
+\r
+ case TK_CC_AND: /* && */\r
+ {\r
+ if (state == CCS_VALUE) {\r
+ r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type,\r
+ &val_type, &state, env);\r
+ if (r != 0) goto err;\r
+ }\r
+ /* initialize local variables */\r
+ and_start = 1;\r
+ state = CCS_START;\r
+\r
+ if (IS_NOT_NULL(prev_cc)) {\r
+ r = and_cclass(prev_cc, cc, env->enc);\r
+ if (r != 0) goto err;\r
+ bbuf_free(cc->mbuf);\r
+ }\r
+ else {\r
+ prev_cc = cc;\r
+ cc = &work_cc;\r
+ }\r
+ initialize_cclass(cc);\r
+ }\r
+ break;\r
+\r
+ case TK_EOT:\r
+ r = ONIGERR_PREMATURE_END_OF_CHAR_CLASS;\r
+ goto err;\r
+ break;\r
+ default:\r
+ r = ONIGERR_PARSER_BUG;\r
+ goto err;\r
+ break;\r
+ }\r
+\r
+ if (fetched)\r
+ r = tok->type;\r
+ else {\r
+ r = fetch_token_in_cc(tok, &p, end, env);\r
+ if (r < 0) goto err;\r
+ }\r
+ }\r
+\r
+ if (state == CCS_VALUE) {\r
+ r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type,\r
+ &val_type, &state, env);\r
+ if (r != 0) goto err;\r
+ }\r
+\r
+ if (IS_NOT_NULL(prev_cc)) {\r
+ r = and_cclass(prev_cc, cc, env->enc);\r
+ if (r != 0) goto err;\r
+ bbuf_free(cc->mbuf);\r
+ cc = prev_cc;\r
+ }\r
+\r
+ if (neg != 0)\r
+ NCCLASS_SET_NOT(cc);\r
+ else\r
+ NCCLASS_CLEAR_NOT(cc);\r
+ if (IS_NCCLASS_NOT(cc) &&\r
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC)) {\r
+ int is_empty;\r
+\r
+ is_empty = (IS_NULL(cc->mbuf) ? 1 : 0);\r
+ if (is_empty != 0)\r
+ BITSET_IS_EMPTY(cc->bs, is_empty);\r
+\r
+ if (is_empty == 0) {\r
+#define NEWLINE_CODE 0x0a\r
+\r
+ if (ONIGENC_IS_CODE_NEWLINE(env->enc, NEWLINE_CODE)) {\r
+ if (ONIGENC_CODE_TO_MBCLEN(env->enc, NEWLINE_CODE) == 1)\r
+ BITSET_SET_BIT(cc->bs, NEWLINE_CODE);\r
+ else\r
+ add_code_range(&(cc->mbuf), env, NEWLINE_CODE, NEWLINE_CODE);\r
+ }\r
+ }\r
+ }\r
+ *src = p;\r
+ return 0;\r
+\r
+ err:\r
+ if (cc != NCCLASS(*np))\r
+ bbuf_free(cc->mbuf);\r
+ onig_node_free(*np);\r
+ return r;\r
+}\r
+\r
+static int parse_subexp(Node** top, OnigToken* tok, int term,\r
+ UChar** src, UChar* end, ScanEnv* env);\r
+\r
+static int\r
+parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end,\r
+ ScanEnv* env)\r
+{\r
+ int r, num;\r
+ Node *target;\r
+ OnigOptionType option;\r
+ OnigCodePoint c;\r
+ OnigEncoding enc = env->enc;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ int list_capture;\r
+#endif\r
+\r
+ UChar* p = *src;\r
+ PFETCH_READY;\r
+\r
+ *np = NULL;\r
+ if (PEND) return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;\r
+\r
+ option = env->option;\r
+ if (PPEEK_IS('?') &&\r
+ IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_GROUP_EFFECT)) {\r
+ PINC;\r
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\r
+\r
+ PFETCH(c);\r
+ switch (c) {\r
+ case ':': /* (?:...) grouping only */\r
+ group:\r
+ r = fetch_token(tok, &p, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_subexp(np, tok, term, &p, end, env);\r
+ if (r < 0) return r;\r
+ *src = p;\r
+ return 1; /* group */\r
+ break;\r
+\r
+ case '=':\r
+ *np = onig_node_new_anchor(ANCHOR_PREC_READ);\r
+ break;\r
+ case '!': /* preceding read */\r
+ *np = onig_node_new_anchor(ANCHOR_PREC_READ_NOT);\r
+ break;\r
+ case '>': /* (?>...) stop backtrack */\r
+ *np = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\r
+ break;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ case '\'':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\r
+ goto named_group1;\r
+ }\r
+ else\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ break;\r
+#endif\r
+\r
+ case '<': /* look behind (?<=...), (?<!...) */\r
+ PFETCH(c);\r
+ if (c == '=')\r
+ *np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND);\r
+ else if (c == '!')\r
+ *np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND_NOT);\r
+#ifdef USE_NAMED_GROUP\r
+ else {\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\r
+ UChar *name;\r
+ UChar *name_end;\r
+\r
+ PUNFETCH;\r
+ c = '<';\r
+\r
+ named_group1:\r
+ list_capture = 0;\r
+\r
+ named_group2:\r
+ name = p;\r
+ r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &num, 0);\r
+ if (r < 0) return r;\r
+\r
+ num = scan_env_add_mem_entry(env);\r
+ if (num < 0) return num;\r
+ if (list_capture != 0 && num >= (int )BIT_STATUS_BITS_NUM)\r
+ return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;\r
+\r
+ r = name_add(env->reg, name, name_end, num, env);\r
+ if (r != 0) return r;\r
+ *np = node_new_enclose_memory(env->option, 1);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ NENCLOSE(*np)->regnum = num;\r
+ if (list_capture != 0)\r
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);\r
+ env->num_named++;\r
+ }\r
+ else {\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ }\r
+ }\r
+#else\r
+ else {\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ }\r
+#endif\r
+ break;\r
+\r
+ case '@':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)) {\r
+#ifdef USE_NAMED_GROUP\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\r
+ PFETCH(c);\r
+ if (c == '<' || c == '\'') {\r
+ list_capture = 1;\r
+ goto named_group2; /* (?@<name>...) */\r
+ }\r
+ PUNFETCH;\r
+ }\r
+#endif\r
+ *np = node_new_enclose_memory(env->option, 0);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ num = scan_env_add_mem_entry(env);\r
+ if (num < 0) {\r
+ onig_node_free(*np);\r
+ return num;\r
+ }\r
+ else if (num >= (int )BIT_STATUS_BITS_NUM) {\r
+ onig_node_free(*np);\r
+ return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;\r
+ }\r
+ NENCLOSE(*np)->regnum = num;\r
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);\r
+ }\r
+ else {\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ }\r
+ break;\r
+\r
+#ifdef USE_POSIXLINE_OPTION\r
+ case 'p':\r
+#endif\r
+ case '-': case 'i': case 'm': case 's': case 'x':\r
+ {\r
+ int neg = 0;\r
+\r
+ while (1) {\r
+ switch (c) {\r
+ case ':':\r
+ case ')':\r
+ break;\r
+\r
+ case '-': neg = 1; break;\r
+ case 'x': ONOFF(option, ONIG_OPTION_EXTEND, neg); break;\r
+ case 'i': ONOFF(option, ONIG_OPTION_IGNORECASE, neg); break;\r
+ case 's':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {\r
+ ONOFF(option, ONIG_OPTION_MULTILINE, neg);\r
+ }\r
+ else\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ break;\r
+\r
+ case 'm':\r
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {\r
+ ONOFF(option, ONIG_OPTION_SINGLELINE, (neg == 0 ? 1 : 0));\r
+ }\r
+ else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) {\r
+ ONOFF(option, ONIG_OPTION_MULTILINE, neg);\r
+ }\r
+ else\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ break;\r
+#ifdef USE_POSIXLINE_OPTION\r
+ case 'p':\r
+ ONOFF(option, ONIG_OPTION_MULTILINE|ONIG_OPTION_SINGLELINE, neg);\r
+ break;\r
+#endif\r
+ default:\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ }\r
+\r
+ if (c == ')') {\r
+ *np = node_new_option(option);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ *src = p;\r
+ return 2; /* option only */\r
+ }\r
+ else if (c == ':') {\r
+ OnigOptionType prev = env->option;\r
+\r
+ env->option = option;\r
+ r = fetch_token(tok, &p, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_subexp(&target, tok, term, &p, end, env);\r
+ env->option = prev;\r
+ if (r < 0) return r;\r
+ *np = node_new_option(option);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ NENCLOSE(*np)->target = target;\r
+ *src = p;\r
+ return 0;\r
+ }\r
+\r
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\r
+ PFETCH(c);\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_UNDEFINED_GROUP_OPTION;\r
+ }\r
+ }\r
+ else {\r
+ if (ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_DONT_CAPTURE_GROUP))\r
+ goto group;\r
+\r
+ *np = node_new_enclose_memory(env->option, 0);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ num = scan_env_add_mem_entry(env);\r
+ if (num < 0) return num;\r
+ NENCLOSE(*np)->regnum = num;\r
+ }\r
+\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ r = fetch_token(tok, &p, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_subexp(&target, tok, term, &p, end, env);\r
+ if (r < 0) return r;\r
+\r
+ if (NTYPE(*np) == NT_ANCHOR)\r
+ NANCHOR(*np)->target = target;\r
+ else {\r
+ NENCLOSE(*np)->target = target;\r
+ if (NENCLOSE(*np)->type == ENCLOSE_MEMORY) {\r
+ /* Don't move this to previous of parse_subexp() */\r
+ r = scan_env_set_mem_node(env, NENCLOSE(*np)->regnum, *np);\r
+ if (r != 0) return r;\r
+ }\r
+ }\r
+\r
+ *src = p;\r
+ return 0;\r
+}\r
+\r
+static const char* PopularQStr[] = {\r
+ "?", "*", "+", "??", "*?", "+?"\r
+};\r
+\r
+static const char* ReduceQStr[] = {\r
+ "", "", "*", "*?", "??", "+ and ??", "+? and ?"\r
+};\r
+\r
+static int\r
+set_quantifier(Node* qnode, Node* target, int group, ScanEnv* env)\r
+{\r
+ QtfrNode* qn;\r
+\r
+ qn = NQTFR(qnode);\r
+ if (qn->lower == 1 && qn->upper == 1) {\r
+ return 1;\r
+ }\r
+\r
+ switch (NTYPE(target)) {\r
+ case NT_STR:\r
+ if (! group) {\r
+ StrNode* sn = NSTR(target);\r
+ if (str_node_can_be_split(sn, env->enc)) {\r
+ Node* n = str_node_split_last_char(sn, env->enc);\r
+ if (IS_NOT_NULL(n)) {\r
+ qn->target = n;\r
+ return 2;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case NT_QTFR:\r
+ { /* check redundant double repeat. */\r
+ /* verbose warn (?:.?)? etc... but not warn (.?)? etc... */\r
+ QtfrNode* qnt = NQTFR(target);\r
+ int nestq_num = popular_quantifier_num(qn);\r
+ int targetq_num = popular_quantifier_num(qnt);\r
+\r
+#ifdef USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR\r
+ if (!IS_QUANTIFIER_BY_NUMBER(qn) && !IS_QUANTIFIER_BY_NUMBER(qnt) &&\r
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT)) {\r
+ UChar buf[WARN_BUFSIZE];\r
+\r
+ switch(ReduceTypeTable[targetq_num][nestq_num]) {\r
+ case RQ_ASIS:\r
+ break;\r
+\r
+ case RQ_DEL:\r
+ if (onig_verb_warn != onig_null_warn) {\r
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\r
+ env->pattern, env->pattern_end,\r
+ (UChar* )"redundant nested repeat operator");\r
+ (*onig_verb_warn)((char* )buf);\r
+ }\r
+ goto warn_exit;\r
+ break;\r
+\r
+ default:\r
+ if (onig_verb_warn != onig_null_warn) {\r
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\r
+ env->pattern, env->pattern_end,\r
+ (UChar* )"nested repeat operator %s and %s was replaced with '%s'",\r
+ PopularQStr[targetq_num], PopularQStr[nestq_num],\r
+ ReduceQStr[ReduceTypeTable[targetq_num][nestq_num]]);\r
+ (*onig_verb_warn)((char* )buf);\r
+ }\r
+ goto warn_exit;\r
+ break;\r
+ }\r
+ }\r
+\r
+ warn_exit:\r
+#endif\r
+ if (targetq_num >= 0) {\r
+ if (nestq_num >= 0) {\r
+ onig_reduce_nested_quantifier(qnode, target);\r
+ goto q_exit;\r
+ }\r
+ else if (targetq_num == 1 || targetq_num == 2) { /* * or + */\r
+ /* (?:a*){n,m}, (?:a+){n,m} => (?:a*){n,n}, (?:a+){n,n} */\r
+ if (! IS_REPEAT_INFINITE(qn->upper) && qn->upper > 1 && qn->greedy) {\r
+ qn->upper = (qn->lower == 0 ? 1 : qn->lower);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ qn->target = target;\r
+ q_exit:\r
+ return 0;\r
+}\r
+\r
+\r
+#ifdef USE_SHARED_CCLASS_TABLE\r
+\r
+#define THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS 8\r
+\r
+/* for ctype node hash table */\r
+\r
+typedef struct {\r
+ OnigEncoding enc;\r
+ int not;\r
+ int type;\r
+} type_cclass_key;\r
+\r
+static int type_cclass_cmp(type_cclass_key* x, type_cclass_key* y)\r
+{\r
+ if (x->type != y->type) return 1;\r
+ if (x->enc != y->enc) return 1;\r
+ if (x->not != y->not) return 1;\r
+ return 0;\r
+}\r
+\r
+static int type_cclass_hash(type_cclass_key* key)\r
+{\r
+ int i, val;\r
+ UChar *p;\r
+\r
+ val = 0;\r
+\r
+ p = (UChar* )&(key->enc);\r
+ for (i = 0; i < (int )sizeof(key->enc); i++) {\r
+ val = val * 997 + (int )*p++;\r
+ }\r
+\r
+ p = (UChar* )(&key->type);\r
+ for (i = 0; i < (int )sizeof(key->type); i++) {\r
+ val = val * 997 + (int )*p++;\r
+ }\r
+\r
+ val += key->not;\r
+ return val + (val >> 5);\r
+}\r
+\r
+static struct st_hash_type type_type_cclass_hash = {\r
+ type_cclass_cmp,\r
+ type_cclass_hash,\r
+};\r
+\r
+static st_table* OnigTypeCClassTable;\r
+\r
+\r
+static int\r
+i_free_shared_class(type_cclass_key* key, Node* node, void* arg ARG_UNUSED)\r
+{\r
+ if (IS_NOT_NULL(node)) {\r
+ CClassNode* cc = NCCLASS(node);\r
+ if (IS_NOT_NULL(cc->mbuf)) xfree(cc->mbuf);\r
+ xfree(node);\r
+ }\r
+\r
+ if (IS_NOT_NULL(key)) xfree(key);\r
+ return ST_DELETE;\r
+}\r
+\r
+extern int\r
+onig_free_shared_cclass_table(void)\r
+{\r
+ if (IS_NOT_NULL(OnigTypeCClassTable)) {\r
+ onig_st_foreach(OnigTypeCClassTable, i_free_shared_class, 0);\r
+ onig_st_free_table(OnigTypeCClassTable);\r
+ OnigTypeCClassTable = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+#endif /* USE_SHARED_CCLASS_TABLE */\r
+\r
+\r
+#ifndef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\r
+static int\r
+clear_not_flag_cclass(CClassNode* cc, OnigEncoding enc)\r
+{\r
+ BBuf *tbuf;\r
+ int r;\r
+\r
+ if (IS_NCCLASS_NOT(cc)) {\r
+ bitset_invert(cc->bs);\r
+\r
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {\r
+ r = not_code_range_buf(enc, cc->mbuf, &tbuf);\r
+ if (r != 0) return r;\r
+\r
+ bbuf_free(cc->mbuf);\r
+ cc->mbuf = tbuf;\r
+ }\r
+\r
+ NCCLASS_CLEAR_NOT(cc);\r
+ }\r
+\r
+ return 0;\r
+}\r
+#endif /* CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS */\r
+\r
+typedef struct {\r
+ ScanEnv* env;\r
+ CClassNode* cc;\r
+ Node* alt_root;\r
+ Node** ptail;\r
+} IApplyCaseFoldArg;\r
+\r
+static int\r
+i_apply_case_fold(OnigCodePoint from, OnigCodePoint to[],\r
+ int to_len, void* arg)\r
+{\r
+ IApplyCaseFoldArg* iarg;\r
+ ScanEnv* env;\r
+ CClassNode* cc;\r
+ BitSetRef bs;\r
+\r
+ iarg = (IApplyCaseFoldArg* )arg;\r
+ env = iarg->env;\r
+ cc = iarg->cc;\r
+ bs = cc->bs;\r
+\r
+ if (to_len == 1) {\r
+ int is_in = onig_is_code_in_cc(env->enc, from, cc);\r
+#ifdef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\r
+ if ((is_in != 0 && !IS_NCCLASS_NOT(cc)) ||\r
+ (is_in == 0 && IS_NCCLASS_NOT(cc))) {\r
+ if (ONIGENC_MBC_MINLEN(env->enc) > 1 || *to >= SINGLE_BYTE_SIZE) {\r
+ add_code_range(&(cc->mbuf), env, *to, *to);\r
+ }\r
+ else {\r
+ BITSET_SET_BIT(bs, *to);\r
+ }\r
+ }\r
+#else\r
+ if (is_in != 0) {\r
+ if (ONIGENC_MBC_MINLEN(env->enc) > 1 || *to >= SINGLE_BYTE_SIZE) {\r
+ if (IS_NCCLASS_NOT(cc)) clear_not_flag_cclass(cc, env->enc);\r
+ add_code_range(&(cc->mbuf), env, *to, *to);\r
+ }\r
+ else {\r
+ if (IS_NCCLASS_NOT(cc)) {\r
+ BITSET_CLEAR_BIT(bs, *to);\r
+ }\r
+ else\r
+ BITSET_SET_BIT(bs, *to);\r
+ }\r
+ }\r
+#endif /* CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS */\r
+ }\r
+ else {\r
+ int r, i, len;\r
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\r
+ Node *snode = NULL_NODE;\r
+\r
+ if (onig_is_code_in_cc(env->enc, from, cc)\r
+#ifdef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\r
+ && !IS_NCCLASS_NOT(cc)\r
+#endif\r
+ ) {\r
+ for (i = 0; i < to_len; i++) {\r
+ len = ONIGENC_CODE_TO_MBC(env->enc, to[i], buf);\r
+ if (i == 0) {\r
+ snode = onig_node_new_str(buf, buf + len);\r
+ CHECK_NULL_RETURN_MEMERR(snode);\r
+\r
+ /* char-class expanded multi-char only\r
+ compare with string folded at match time. */\r
+ NSTRING_SET_AMBIG(snode);\r
+ }\r
+ else {\r
+ r = onig_node_str_cat(snode, buf, buf + len);\r
+ if (r < 0) {\r
+ onig_node_free(snode);\r
+ return r;\r
+ }\r
+ }\r
+ }\r
+\r
+ *(iarg->ptail) = onig_node_new_alt(snode, NULL_NODE);\r
+ CHECK_NULL_RETURN_MEMERR(*(iarg->ptail));\r
+ iarg->ptail = &(NCDR((*(iarg->ptail))));\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+parse_exp(Node** np, OnigToken* tok, int term,\r
+ UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r, len, group = 0;\r
+ Node* qn;\r
+ Node** targetp;\r
+\r
+ *np = NULL;\r
+ if (tok->type == (enum TokenSyms )term)\r
+ goto end_of_token;\r
+\r
+ switch (tok->type) {\r
+ case TK_ALT:\r
+ case TK_EOT:\r
+ end_of_token:\r
+ *np = node_new_empty();\r
+ return tok->type;\r
+ break;\r
+\r
+ case TK_SUBEXP_OPEN:\r
+ r = parse_enclose(np, tok, TK_SUBEXP_CLOSE, src, end, env);\r
+ if (r < 0) return r;\r
+ if (r == 1) group = 1;\r
+ else if (r == 2) { /* option only */\r
+ Node* target;\r
+ OnigOptionType prev = env->option;\r
+\r
+ env->option = NENCLOSE(*np)->option;\r
+ r = fetch_token(tok, src, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_subexp(&target, tok, term, src, end, env);\r
+ env->option = prev;\r
+ if (r < 0) return r;\r
+ NENCLOSE(*np)->target = target; \r
+ return tok->type;\r
+ }\r
+ break;\r
+\r
+ case TK_SUBEXP_CLOSE:\r
+ if (! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP))\r
+ return ONIGERR_UNMATCHED_CLOSE_PARENTHESIS;\r
+\r
+ if (tok->escaped) goto tk_raw_byte;\r
+ else goto tk_byte;\r
+ break;\r
+\r
+ case TK_STRING:\r
+ tk_byte:\r
+ {\r
+ *np = node_new_str(tok->backp, *src);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+\r
+ while (1) {\r
+ r = fetch_token(tok, src, end, env);\r
+ if (r < 0) return r;\r
+ if (r != TK_STRING) break;\r
+\r
+ r = onig_node_str_cat(*np, tok->backp, *src);\r
+ if (r < 0) return r;\r
+ }\r
+\r
+ string_end:\r
+ targetp = np;\r
+ goto repeat;\r
+ }\r
+ break;\r
+\r
+ case TK_RAW_BYTE:\r
+ tk_raw_byte:\r
+ {\r
+ *np = node_new_str_raw_char((UChar )tok->u.c);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ len = 1;\r
+ while (1) {\r
+ if (len >= ONIGENC_MBC_MINLEN(env->enc)) {\r
+ if (len == enclen(env->enc, NSTR(*np)->s)) {\r
+ r = fetch_token(tok, src, end, env);\r
+ NSTRING_CLEAR_RAW(*np);\r
+ goto string_end;\r
+ }\r
+ }\r
+\r
+ r = fetch_token(tok, src, end, env);\r
+ if (r < 0) return r;\r
+ if (r != TK_RAW_BYTE) {\r
+ /* Don't use this, it is wrong for little endian encodings. */\r
+#ifdef USE_PAD_TO_SHORT_BYTE_CHAR\r
+ int rem;\r
+ if (len < ONIGENC_MBC_MINLEN(env->enc)) {\r
+ rem = ONIGENC_MBC_MINLEN(env->enc) - len;\r
+ (void )node_str_head_pad(NSTR(*np), rem, (UChar )0);\r
+ if (len + rem == enclen(env->enc, NSTR(*np)->s)) {\r
+ NSTRING_CLEAR_RAW(*np);\r
+ goto string_end;\r
+ }\r
+ }\r
+#endif\r
+ return ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\r
+ }\r
+\r
+ r = node_str_cat_char(*np, (UChar )tok->u.c);\r
+ if (r < 0) return r;\r
+\r
+ len++;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case TK_CODE_POINT:\r
+ {\r
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\r
+ int num = ONIGENC_CODE_TO_MBC(env->enc, tok->u.code, buf);\r
+ if (num < 0) return num;\r
+#ifdef NUMBERED_CHAR_IS_NOT_CASE_AMBIG\r
+ *np = node_new_str_raw(buf, buf + num);\r
+#else\r
+ *np = node_new_str(buf, buf + num);\r
+#endif\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ }\r
+ break;\r
+\r
+ case TK_QUOTE_OPEN:\r
+ {\r
+ OnigCodePoint end_op[2];\r
+ UChar *qstart, *qend, *nextp;\r
+\r
+ end_op[0] = (OnigCodePoint )MC_ESC(env->syntax);\r
+ end_op[1] = (OnigCodePoint )'E';\r
+ qstart = *src;\r
+ qend = find_str_position(end_op, 2, qstart, end, &nextp, env->enc);\r
+ if (IS_NULL(qend)) {\r
+ nextp = qend = end;\r
+ }\r
+ *np = node_new_str(qstart, qend);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ *src = nextp;\r
+ }\r
+ break;\r
+\r
+ case TK_CHAR_TYPE:\r
+ {\r
+ switch (tok->u.prop.ctype) {\r
+ case ONIGENC_CTYPE_WORD:\r
+ *np = node_new_ctype(tok->u.prop.ctype, tok->u.prop.not);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ break;\r
+\r
+ case ONIGENC_CTYPE_SPACE:\r
+ case ONIGENC_CTYPE_DIGIT:\r
+ case ONIGENC_CTYPE_XDIGIT:\r
+ {\r
+ CClassNode* cc;\r
+\r
+#ifdef USE_SHARED_CCLASS_TABLE\r
+ const OnigCodePoint *mbr;\r
+ OnigCodePoint sb_out;\r
+\r
+ r = ONIGENC_GET_CTYPE_CODE_RANGE(env->enc, tok->u.prop.ctype,\r
+ &sb_out, &mbr);\r
+ if (r == 0 &&\r
+ ONIGENC_CODE_RANGE_NUM(mbr)\r
+ >= THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS) {\r
+ type_cclass_key key;\r
+ type_cclass_key* new_key;\r
+\r
+ key.enc = env->enc;\r
+ key.not = tok->u.prop.not;\r
+ key.type = tok->u.prop.ctype;\r
+\r
+ THREAD_ATOMIC_START;\r
+\r
+ if (IS_NULL(OnigTypeCClassTable)) {\r
+ OnigTypeCClassTable\r
+ = onig_st_init_table_with_size(&type_type_cclass_hash, 10);\r
+ if (IS_NULL(OnigTypeCClassTable)) {\r
+ THREAD_ATOMIC_END;\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ }\r
+ else {\r
+ if (onig_st_lookup(OnigTypeCClassTable, (st_data_t )&key,\r
+ (st_data_t* )np)) {\r
+ THREAD_ATOMIC_END;\r
+ break;\r
+ }\r
+ }\r
+\r
+ *np = node_new_cclass_by_codepoint_range(tok->u.prop.not,\r
+ sb_out, mbr);\r
+ if (IS_NULL(*np)) {\r
+ THREAD_ATOMIC_END;\r
+ return ONIGERR_MEMORY;\r
+ }\r
+\r
+ cc = NCCLASS(*np);\r
+ NCCLASS_SET_SHARE(cc);\r
+ new_key = (type_cclass_key* )xmalloc(sizeof(type_cclass_key));\r
+ xmemcpy(new_key, &key, sizeof(type_cclass_key));\r
+ onig_st_add_direct(OnigTypeCClassTable, (st_data_t )new_key,\r
+ (st_data_t )*np);\r
+ \r
+ THREAD_ATOMIC_END;\r
+ }\r
+ else {\r
+#endif\r
+ *np = node_new_cclass();\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ cc = NCCLASS(*np);\r
+ add_ctype_to_cc(cc, tok->u.prop.ctype, 0, env);\r
+ if (tok->u.prop.not != 0) NCCLASS_SET_NOT(cc);\r
+#ifdef USE_SHARED_CCLASS_TABLE\r
+ }\r
+#endif\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_PARSER_BUG;\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case TK_CHAR_PROPERTY:\r
+ r = parse_char_property(np, tok, src, end, env);\r
+ if (r != 0) return r;\r
+ break;\r
+\r
+ case TK_CC_OPEN:\r
+ {\r
+ CClassNode* cc;\r
+\r
+ r = parse_char_class(np, tok, src, end, env);\r
+ if (r != 0) return r;\r
+\r
+ cc = NCCLASS(*np);\r
+ if (IS_IGNORECASE(env->option)) {\r
+ IApplyCaseFoldArg iarg;\r
+\r
+ iarg.env = env;\r
+ iarg.cc = cc;\r
+ iarg.alt_root = NULL_NODE;\r
+ iarg.ptail = &(iarg.alt_root);\r
+\r
+ r = ONIGENC_APPLY_ALL_CASE_FOLD(env->enc, env->case_fold_flag,\r
+ i_apply_case_fold, &iarg);\r
+ if (r != 0) {\r
+ onig_node_free(iarg.alt_root);\r
+ return r;\r
+ }\r
+ if (IS_NOT_NULL(iarg.alt_root)) {\r
+ Node* work = onig_node_new_alt(*np, iarg.alt_root);\r
+ if (IS_NULL(work)) {\r
+ onig_node_free(iarg.alt_root);\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ *np = work;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case TK_ANYCHAR:\r
+ *np = node_new_anychar();\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ break;\r
+\r
+ case TK_ANYCHAR_ANYTIME:\r
+ *np = node_new_anychar();\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ qn = node_new_quantifier(0, REPEAT_INFINITE, 0);\r
+ CHECK_NULL_RETURN_MEMERR(qn);\r
+ NQTFR(qn)->target = *np;\r
+ *np = qn;\r
+ break;\r
+\r
+ case TK_BACKREF:\r
+ len = tok->u.backref.num;\r
+ *np = node_new_backref(len,\r
+ (len > 1 ? tok->u.backref.refs : &(tok->u.backref.ref1)),\r
+ tok->u.backref.by_name,\r
+#ifdef USE_BACKREF_WITH_LEVEL\r
+ tok->u.backref.exist_level,\r
+ tok->u.backref.level,\r
+#endif\r
+ env);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ break;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+ case TK_CALL:\r
+ {\r
+ int gnum = tok->u.call.gnum;\r
+\r
+ if (gnum < 0) {\r
+ gnum = BACKREF_REL_TO_ABS(gnum, env);\r
+ if (gnum <= 0)\r
+ return ONIGERR_INVALID_BACKREF;\r
+ }\r
+ *np = node_new_call(tok->u.call.name, tok->u.call.name_end, gnum);\r
+ CHECK_NULL_RETURN_MEMERR(*np);\r
+ env->num_call++;\r
+ }\r
+ break;\r
+#endif\r
+\r
+ case TK_ANCHOR:\r
+ *np = onig_node_new_anchor(tok->u.anchor);\r
+ break;\r
+\r
+ case TK_OP_REPEAT:\r
+ case TK_INTERVAL:\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS)) {\r
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS))\r
+ return ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED;\r
+ else\r
+ *np = node_new_empty();\r
+ }\r
+ else {\r
+ goto tk_byte;\r
+ }\r
+ break;\r
+\r
+ default:\r
+ return ONIGERR_PARSER_BUG;\r
+ break;\r
+ }\r
+\r
+ {\r
+ targetp = np;\r
+\r
+ re_entry:\r
+ r = fetch_token(tok, src, end, env);\r
+ if (r < 0) return r;\r
+\r
+ repeat:\r
+ if (r == TK_OP_REPEAT || r == TK_INTERVAL) {\r
+ if (is_invalid_quantifier_target(*targetp))\r
+ return ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID;\r
+\r
+ qn = node_new_quantifier(tok->u.repeat.lower, tok->u.repeat.upper,\r
+ (r == TK_INTERVAL ? 1 : 0));\r
+ CHECK_NULL_RETURN_MEMERR(qn);\r
+ NQTFR(qn)->greedy = tok->u.repeat.greedy;\r
+ r = set_quantifier(qn, *targetp, group, env);\r
+ if (r < 0) {\r
+ onig_node_free(qn);\r
+ return r;\r
+ }\r
+\r
+ if (tok->u.repeat.possessive != 0) {\r
+ Node* en;\r
+ en = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\r
+ if (IS_NULL(en)) {\r
+ onig_node_free(qn);\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ NENCLOSE(en)->target = qn;\r
+ qn = en;\r
+ }\r
+\r
+ if (r == 0) {\r
+ *targetp = qn;\r
+ }\r
+ else if (r == 1) {\r
+ onig_node_free(qn);\r
+ }\r
+ else if (r == 2) { /* split case: /abc+/ */\r
+ Node *tmp;\r
+\r
+ *targetp = node_new_list(*targetp, NULL);\r
+ if (IS_NULL(*targetp)) {\r
+ onig_node_free(qn);\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ tmp = NCDR(*targetp) = node_new_list(qn, NULL);\r
+ if (IS_NULL(tmp)) {\r
+ onig_node_free(qn);\r
+ return ONIGERR_MEMORY;\r
+ }\r
+ targetp = &(NCAR(tmp));\r
+ }\r
+ goto re_entry;\r
+ }\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+parse_branch(Node** top, OnigToken* tok, int term,\r
+ UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r;\r
+ Node *node, **headp;\r
+\r
+ *top = NULL;\r
+ r = parse_exp(&node, tok, term, src, end, env);\r
+ if (r < 0) return r;\r
+\r
+ if (r == TK_EOT || r == term || r == TK_ALT) {\r
+ *top = node;\r
+ }\r
+ else {\r
+ *top = node_new_list(node, NULL);\r
+ headp = &(NCDR(*top));\r
+ while (r != TK_EOT && r != term && r != TK_ALT) {\r
+ r = parse_exp(&node, tok, term, src, end, env);\r
+ if (r < 0) return r;\r
+\r
+ if (NTYPE(node) == NT_LIST) {\r
+ *headp = node;\r
+ while (IS_NOT_NULL(NCDR(node))) node = NCDR(node);\r
+ headp = &(NCDR(node));\r
+ }\r
+ else {\r
+ *headp = node_new_list(node, NULL);\r
+ headp = &(NCDR(*headp));\r
+ }\r
+ }\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+/* term_tok: TK_EOT or TK_SUBEXP_CLOSE */\r
+static int\r
+parse_subexp(Node** top, OnigToken* tok, int term,\r
+ UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r;\r
+ Node *node, **headp;\r
+\r
+ *top = NULL;\r
+ r = parse_branch(&node, tok, term, src, end, env);\r
+ if (r < 0) {\r
+ onig_node_free(node);\r
+ return r;\r
+ }\r
+\r
+ if (r == term) {\r
+ *top = node;\r
+ }\r
+ else if (r == TK_ALT) {\r
+ *top = onig_node_new_alt(node, NULL);\r
+ headp = &(NCDR(*top));\r
+ while (r == TK_ALT) {\r
+ r = fetch_token(tok, src, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_branch(&node, tok, term, src, end, env);\r
+ if (r < 0) return r;\r
+\r
+ *headp = onig_node_new_alt(node, NULL);\r
+ headp = &(NCDR(*headp));\r
+ }\r
+\r
+ if (tok->type != (enum TokenSyms )term)\r
+ goto err;\r
+ }\r
+ else {\r
+ err:\r
+ if (term == TK_SUBEXP_CLOSE)\r
+ return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;\r
+ else\r
+ return ONIGERR_PARSER_BUG;\r
+ }\r
+\r
+ return r;\r
+}\r
+\r
+static int\r
+parse_regexp(Node** top, UChar** src, UChar* end, ScanEnv* env)\r
+{\r
+ int r;\r
+ OnigToken tok;\r
+\r
+ r = fetch_token(&tok, src, end, env);\r
+ if (r < 0) return r;\r
+ r = parse_subexp(top, &tok, TK_EOT, src, end, env);\r
+ if (r < 0) return r;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+onig_parse_make_tree(Node** root, const UChar* pattern, const UChar* end,\r
+ regex_t* reg, ScanEnv* env)\r
+{\r
+ int r;\r
+ UChar* p;\r
+\r
+#ifdef USE_NAMED_GROUP\r
+ names_clear(reg);\r
+#endif\r
+\r
+ scan_env_clear(env);\r
+ env->option = reg->options;\r
+ env->case_fold_flag = reg->case_fold_flag;\r
+ env->enc = reg->enc;\r
+ env->syntax = reg->syntax;\r
+ env->pattern = (UChar* )pattern;\r
+ env->pattern_end = (UChar* )end;\r
+ env->reg = reg;\r
+\r
+ *root = NULL;\r
+ p = (UChar* )pattern;\r
+ r = parse_regexp(root, &p, (UChar* )end, env);\r
+ reg->num_mem = env->num_mem;\r
+ return r;\r
+}\r
+\r
+extern void\r
+onig_scan_env_set_error_string(ScanEnv* env, int ecode ARG_UNUSED,\r
+ UChar* arg, UChar* arg_end)\r
+{\r
+ env->error = arg;\r
+ env->error_end = arg_end;\r
+}\r
--- /dev/null
+#ifndef REGPARSE_H\r
+#define REGPARSE_H\r
+/**********************************************************************\r
+ regparse.h - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ * \r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+/* node type */\r
+#define NT_STR 0\r
+#define NT_CCLASS 1\r
+#define NT_CTYPE 2\r
+#define NT_CANY 3\r
+#define NT_BREF 4\r
+#define NT_QTFR 5\r
+#define NT_ENCLOSE 6\r
+#define NT_ANCHOR 7\r
+#define NT_LIST 8\r
+#define NT_ALT 9\r
+#define NT_CALL 10\r
+\r
+/* node type bit */\r
+#define NTYPE2BIT(type) (1<<(type))\r
+\r
+#define BIT_NT_STR NTYPE2BIT(NT_STR)\r
+#define BIT_NT_CCLASS NTYPE2BIT(NT_CCLASS)\r
+#define BIT_NT_CTYPE NTYPE2BIT(NT_CTYPE)\r
+#define BIT_NT_CANY NTYPE2BIT(NT_CANY)\r
+#define BIT_NT_BREF NTYPE2BIT(NT_BREF)\r
+#define BIT_NT_QTFR NTYPE2BIT(NT_QTFR)\r
+#define BIT_NT_ENCLOSE NTYPE2BIT(NT_ENCLOSE)\r
+#define BIT_NT_ANCHOR NTYPE2BIT(NT_ANCHOR)\r
+#define BIT_NT_LIST NTYPE2BIT(NT_LIST)\r
+#define BIT_NT_ALT NTYPE2BIT(NT_ALT)\r
+#define BIT_NT_CALL NTYPE2BIT(NT_CALL)\r
+\r
+#define IS_NODE_TYPE_SIMPLE(type) \\r
+ ((NTYPE2BIT(type) & (BIT_NT_STR | BIT_NT_CCLASS | BIT_NT_CTYPE |\\r
+ BIT_NT_CANY | BIT_NT_BREF)) != 0)\r
+\r
+#define NTYPE(node) ((node)->u.base.type)\r
+#define SET_NTYPE(node, ntype) (node)->u.base.type = (ntype)\r
+\r
+#define NSTR(node) (&((node)->u.str))\r
+#define NCCLASS(node) (&((node)->u.cclass))\r
+#define NCTYPE(node) (&((node)->u.ctype))\r
+#define NBREF(node) (&((node)->u.bref))\r
+#define NQTFR(node) (&((node)->u.qtfr))\r
+#define NENCLOSE(node) (&((node)->u.enclose))\r
+#define NANCHOR(node) (&((node)->u.anchor))\r
+#define NCONS(node) (&((node)->u.cons))\r
+#define NCALL(node) (&((node)->u.call))\r
+\r
+#define NCAR(node) (NCONS(node)->car)\r
+#define NCDR(node) (NCONS(node)->cdr)\r
+\r
+\r
+\r
+#define ANCHOR_ANYCHAR_STAR_MASK (ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML)\r
+#define ANCHOR_END_BUF_MASK (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)\r
+\r
+#define ENCLOSE_MEMORY (1<<0)\r
+#define ENCLOSE_OPTION (1<<1)\r
+#define ENCLOSE_STOP_BACKTRACK (1<<2)\r
+\r
+#define NODE_STR_MARGIN 16\r
+#define NODE_STR_BUF_SIZE 24 /* sizeof(CClassNode) - sizeof(int)*4 */\r
+#define NODE_BACKREFS_SIZE 6\r
+\r
+#define NSTR_RAW (1<<0) /* by backslashed number */\r
+#define NSTR_AMBIG (1<<1)\r
+#define NSTR_DONT_GET_OPT_INFO (1<<2)\r
+\r
+#define NSTRING_LEN(node) ((int)((node)->u.str.end - (node)->u.str.s))\r
+#define NSTRING_SET_RAW(node) (node)->u.str.flag |= NSTR_RAW\r
+#define NSTRING_CLEAR_RAW(node) (node)->u.str.flag &= ~NSTR_RAW\r
+#define NSTRING_SET_AMBIG(node) (node)->u.str.flag |= NSTR_AMBIG\r
+#define NSTRING_SET_DONT_GET_OPT_INFO(node) \\r
+ (node)->u.str.flag |= NSTR_DONT_GET_OPT_INFO\r
+#define NSTRING_IS_RAW(node) (((node)->u.str.flag & NSTR_RAW) != 0)\r
+#define NSTRING_IS_AMBIG(node) (((node)->u.str.flag & NSTR_AMBIG) != 0)\r
+#define NSTRING_IS_DONT_GET_OPT_INFO(node) \\r
+ (((node)->u.str.flag & NSTR_DONT_GET_OPT_INFO) != 0)\r
+\r
+#define BACKREFS_P(br) \\r
+ (IS_NOT_NULL((br)->back_dynamic) ? (br)->back_dynamic : (br)->back_static);\r
+\r
+#define NQ_TARGET_ISNOT_EMPTY 0\r
+#define NQ_TARGET_IS_EMPTY 1\r
+#define NQ_TARGET_IS_EMPTY_MEM 2\r
+#define NQ_TARGET_IS_EMPTY_REC 3\r
+\r
+/* status bits */\r
+#define NST_MIN_FIXED (1<<0)\r
+#define NST_MAX_FIXED (1<<1)\r
+#define NST_CLEN_FIXED (1<<2)\r
+#define NST_MARK1 (1<<3)\r
+#define NST_MARK2 (1<<4)\r
+#define NST_MEM_BACKREFED (1<<5)\r
+#define NST_STOP_BT_SIMPLE_REPEAT (1<<6)\r
+#define NST_RECURSION (1<<7)\r
+#define NST_CALLED (1<<8)\r
+#define NST_ADDR_FIXED (1<<9)\r
+#define NST_NAMED_GROUP (1<<10)\r
+#define NST_NAME_REF (1<<11)\r
+#define NST_IN_REPEAT (1<<12) /* STK_REPEAT is nested in stack. */\r
+#define NST_NEST_LEVEL (1<<13)\r
+#define NST_BY_NUMBER (1<<14) /* {n,m} */\r
+\r
+#define SET_ENCLOSE_STATUS(node,f) (node)->u.enclose.state |= (f)\r
+#define CLEAR_ENCLOSE_STATUS(node,f) (node)->u.enclose.state &= ~(f)\r
+\r
+#define IS_ENCLOSE_CALLED(en) (((en)->state & NST_CALLED) != 0)\r
+#define IS_ENCLOSE_ADDR_FIXED(en) (((en)->state & NST_ADDR_FIXED) != 0)\r
+#define IS_ENCLOSE_RECURSION(en) (((en)->state & NST_RECURSION) != 0)\r
+#define IS_ENCLOSE_MARK1(en) (((en)->state & NST_MARK1) != 0)\r
+#define IS_ENCLOSE_MARK2(en) (((en)->state & NST_MARK2) != 0)\r
+#define IS_ENCLOSE_MIN_FIXED(en) (((en)->state & NST_MIN_FIXED) != 0)\r
+#define IS_ENCLOSE_MAX_FIXED(en) (((en)->state & NST_MAX_FIXED) != 0)\r
+#define IS_ENCLOSE_CLEN_FIXED(en) (((en)->state & NST_CLEN_FIXED) != 0)\r
+#define IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(en) \\r
+ (((en)->state & NST_STOP_BT_SIMPLE_REPEAT) != 0)\r
+#define IS_ENCLOSE_NAMED_GROUP(en) (((en)->state & NST_NAMED_GROUP) != 0)\r
+\r
+#define SET_CALL_RECURSION(node) (node)->u.call.state |= NST_RECURSION\r
+#define IS_CALL_RECURSION(cn) (((cn)->state & NST_RECURSION) != 0)\r
+#define IS_CALL_NAME_REF(cn) (((cn)->state & NST_NAME_REF) != 0)\r
+#define IS_BACKREF_NAME_REF(bn) (((bn)->state & NST_NAME_REF) != 0)\r
+#define IS_BACKREF_NEST_LEVEL(bn) (((bn)->state & NST_NEST_LEVEL) != 0)\r
+#define IS_QUANTIFIER_IN_REPEAT(qn) (((qn)->state & NST_IN_REPEAT) != 0)\r
+#define IS_QUANTIFIER_BY_NUMBER(qn) (((qn)->state & NST_BY_NUMBER) != 0)\r
+\r
+#define CALLNODE_REFNUM_UNDEF -1\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ UChar* s;\r
+ UChar* end;\r
+ unsigned int flag;\r
+ int capa; /* (allocated size - 1) or 0: use buf[] */\r
+ UChar buf[NODE_STR_BUF_SIZE];\r
+} StrNode;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int state;\r
+ struct _Node* target;\r
+ int lower;\r
+ int upper;\r
+ int greedy;\r
+ int target_empty_info;\r
+ struct _Node* head_exact;\r
+ struct _Node* next_head_exact;\r
+ int is_refered; /* include called node. don't eliminate even if {0} */\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ int comb_exp_check_num; /* 1,2,3...: check, 0: no check */\r
+#endif\r
+} QtfrNode;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int state;\r
+ int type;\r
+ int regnum;\r
+ OnigOptionType option;\r
+ struct _Node* target;\r
+ AbsAddrType call_addr;\r
+ /* for multiple call reference */\r
+ OnigDistance min_len; /* min length (byte) */\r
+ OnigDistance max_len; /* max length (byte) */ \r
+ int char_len; /* character length */\r
+ int opt_count; /* referenced count in optimize_node_left() */\r
+} EncloseNode;\r
+\r
+#ifdef USE_SUBEXP_CALL\r
+\r
+typedef struct {\r
+ int offset;\r
+ struct _Node* target;\r
+} UnsetAddr;\r
+\r
+typedef struct {\r
+ int num;\r
+ int alloc;\r
+ UnsetAddr* us;\r
+} UnsetAddrList;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int state;\r
+ int group_num;\r
+ UChar* name;\r
+ UChar* name_end;\r
+ struct _Node* target; /* EncloseNode : ENCLOSE_MEMORY */\r
+ UnsetAddrList* unset_addr_list;\r
+} CallNode;\r
+\r
+#endif\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int state;\r
+ int back_num;\r
+ int back_static[NODE_BACKREFS_SIZE];\r
+ int* back_dynamic;\r
+ int nest_level;\r
+} BRefNode;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int type;\r
+ struct _Node* target;\r
+ int char_len;\r
+} AnchorNode;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ struct _Node* car;\r
+ struct _Node* cdr;\r
+} ConsAltNode;\r
+\r
+typedef struct {\r
+ NodeBase base;\r
+ int ctype;\r
+ int not;\r
+} CtypeNode;\r
+\r
+typedef struct _Node {\r
+ union {\r
+ NodeBase base;\r
+ StrNode str;\r
+ CClassNode cclass;\r
+ QtfrNode qtfr;\r
+ EncloseNode enclose;\r
+ BRefNode bref;\r
+ AnchorNode anchor;\r
+ ConsAltNode cons;\r
+ CtypeNode ctype;\r
+#ifdef USE_SUBEXP_CALL\r
+ CallNode call;\r
+#endif\r
+ } u;\r
+} Node;\r
+\r
+\r
+#define NULL_NODE ((Node* )0)\r
+\r
+#define SCANENV_MEMNODES_SIZE 8\r
+#define SCANENV_MEM_NODES(senv) \\r
+ (IS_NOT_NULL((senv)->mem_nodes_dynamic) ? \\r
+ (senv)->mem_nodes_dynamic : (senv)->mem_nodes_static)\r
+\r
+typedef struct {\r
+ OnigOptionType option;\r
+ OnigCaseFoldType case_fold_flag;\r
+ OnigEncoding enc;\r
+ OnigSyntaxType* syntax;\r
+ BitStatusType capture_history;\r
+ BitStatusType bt_mem_start;\r
+ BitStatusType bt_mem_end;\r
+ BitStatusType backrefed_mem;\r
+ UChar* pattern;\r
+ UChar* pattern_end;\r
+ UChar* error;\r
+ UChar* error_end;\r
+ regex_t* reg; /* for reg->names only */\r
+ int num_call;\r
+#ifdef USE_SUBEXP_CALL\r
+ UnsetAddrList* unset_addr_list;\r
+#endif\r
+ int num_mem;\r
+#ifdef USE_NAMED_GROUP\r
+ int num_named;\r
+#endif\r
+ int mem_alloc;\r
+ Node* mem_nodes_static[SCANENV_MEMNODES_SIZE];\r
+ Node** mem_nodes_dynamic;\r
+#ifdef USE_COMBINATION_EXPLOSION_CHECK\r
+ int num_comb_exp_check;\r
+ int comb_exp_max_regnum;\r
+ int curr_max_regnum;\r
+ int has_recursion;\r
+#endif\r
+} ScanEnv;\r
+\r
+\r
+#define IS_SYNTAX_OP(syn, opm) (((syn)->op & (opm)) != 0)\r
+#define IS_SYNTAX_OP2(syn, opm) (((syn)->op2 & (opm)) != 0)\r
+#define IS_SYNTAX_BV(syn, bvm) (((syn)->behavior & (bvm)) != 0)\r
+\r
+#ifdef USE_NAMED_GROUP\r
+typedef struct {\r
+ int new_val;\r
+} GroupNumRemap;\r
+\r
+extern int onig_renumber_name_table P_((regex_t* reg, GroupNumRemap* map));\r
+#endif\r
+\r
+extern int onig_strncmp P_((const UChar* s1, const UChar* s2, int n));\r
+extern void onig_strcpy P_((UChar* dest, const UChar* src, const UChar* end));\r
+extern void onig_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));\r
+extern int onig_scan_unsigned_number P_((UChar** src, const UChar* end, OnigEncoding enc));\r
+extern void onig_reduce_nested_quantifier P_((Node* pnode, Node* cnode));\r
+extern void onig_node_conv_to_str_node P_((Node* node, int raw));\r
+extern int onig_node_str_cat P_((Node* node, const UChar* s, const UChar* end));\r
+extern int onig_node_str_set P_((Node* node, const UChar* s, const UChar* end));\r
+extern void onig_node_free P_((Node* node));\r
+extern Node* onig_node_new_enclose P_((int type));\r
+extern Node* onig_node_new_anchor P_((int type));\r
+extern Node* onig_node_new_str P_((const UChar* s, const UChar* end));\r
+extern Node* onig_node_new_list P_((Node* left, Node* right));\r
+extern Node* onig_node_list_add P_((Node* list, Node* x));\r
+extern Node* onig_node_new_alt P_((Node* left, Node* right));\r
+extern void onig_node_str_clear P_((Node* node));\r
+extern int onig_free_node_list P_((void));\r
+extern int onig_names_free P_((regex_t* reg));\r
+extern int onig_parse_make_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env));\r
+extern int onig_free_shared_cclass_table P_((void));\r
+\r
+#ifdef ONIG_DEBUG\r
+#ifdef USE_NAMED_GROUP\r
+extern int onig_print_names(FILE*, regex_t*);\r
+#endif\r
+#endif\r
+\r
+#endif /* REGPARSE_H */\r
--- /dev/null
+/**********************************************************************\r
+ regposerr.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2007 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR> \r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+/*#include "config.h"*/\r
+#include "onigposix.h"\r
+\r
+#if 0\r
+#ifdef HAVE_STRING_H\r
+# include <string.h>\r
+#else\r
+# include <strings.h>\r
+#endif\r
+#endif\r
+\r
+#if defined(__GNUC__)\r
+# define ARG_UNUSED __attribute__ ((unused))\r
+#else\r
+# define ARG_UNUSED\r
+#endif\r
+\r
+static char* ESTRING[] = {\r
+ NULL,\r
+ "failed to match", /* REG_NOMATCH */\r
+ "Invalid regular expression", /* REG_BADPAT */\r
+ "invalid collating element referenced", /* REG_ECOLLATE */\r
+ "invalid character class type referenced", /* REG_ECTYPE */\r
+ "bad backslash-escape sequence", /* REG_EESCAPE */\r
+ "invalid back reference number", /* REG_ESUBREG */\r
+ "imbalanced [ and ]", /* REG_EBRACK */\r
+ "imbalanced ( and )", /* REG_EPAREN */\r
+ "imbalanced { and }", /* REG_EBRACE */\r
+ "invalid repeat range {n,m}", /* REG_BADBR */\r
+ "invalid range", /* REG_ERANGE */\r
+ "Out of memory", /* REG_ESPACE */\r
+ "? * + not preceded by valid regular expression", /* REG_BADRPT */\r
+\r
+ /* Extended errors */\r
+ "internal error", /* REG_EONIG_INTERNAL */\r
+ "invalid wide char value", /* REG_EONIG_BADWC */\r
+ "invalid argument", /* REG_EONIG_BADARG */\r
+ "multi-thread error" /* REG_EONIG_THREAD */\r
+};\r
+\r
+//#include <stdio.h>\r
+\r
+\r
+extern size_t\r
+regerror(int posix_ecode, const regex_t* reg ARG_UNUSED, char* buf,\r
+ size_t size)\r
+{\r
+ char* s;\r
+ char tbuf[35];\r
+ size_t len;\r
+\r
+ if (posix_ecode > 0\r
+ && posix_ecode < (int )(sizeof(ESTRING) / sizeof(ESTRING[0]))) {\r
+ s = ESTRING[posix_ecode];\r
+ }\r
+ else if (posix_ecode == 0) {\r
+ s = "";\r
+ }\r
+ else {\r
+ sprintf(tbuf, "undefined error code (%d)", posix_ecode);\r
+ s = tbuf;\r
+ }\r
+\r
+ len = strlen_s(s, MAX_STRING_SIZE) + 1; /* use strlen() because s is ascii encoding. */\r
+\r
+ if (buf != NULL && size > 0) {\r
+ strncpy_s(buf, size, s, size - 1);\r
+ buf[size - 1] = '\0';\r
+ }\r
+ return len;\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ regposix.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#define regex_t onig_regex_t\r
+#include "regint.h"\r
+#undef regex_t\r
+#include "onigposix.h"\r
+\r
+#define ONIG_C(reg) ((onig_regex_t* )((reg)->onig))\r
+#define PONIG_C(reg) ((onig_regex_t** )(&(reg)->onig))\r
+\r
+/* #define ENC_STRING_LEN(enc,s,len) len = strlen(s) */\r
+#define ENC_STRING_LEN(enc,s,len) do { \\r
+ if (ONIGENC_MBC_MINLEN(enc) == 1) { \\r
+ UChar* tmps = (UChar* )(s); \\r
+ while (*tmps != 0) tmps++; \\r
+ len = (int)(tmps - (UChar* )(s)); \\r
+ } \\r
+ else { \\r
+ len = onigenc_str_bytelen_null(enc, (UChar* )s); \\r
+ } \\r
+} while(0)\r
+\r
+typedef struct {\r
+ int onig_err;\r
+ int posix_err;\r
+} O2PERR;\r
+\r
+static int\r
+onig2posix_error_code(int code)\r
+{\r
+ static const O2PERR o2p[] = {\r
+ { ONIG_MISMATCH, REG_NOMATCH },\r
+ { ONIG_NO_SUPPORT_CONFIG, REG_EONIG_INTERNAL },\r
+ { ONIGERR_MEMORY, REG_ESPACE },\r
+ { ONIGERR_MATCH_STACK_LIMIT_OVER, REG_EONIG_INTERNAL },\r
+ { ONIGERR_TYPE_BUG, REG_EONIG_INTERNAL },\r
+ { ONIGERR_PARSER_BUG, REG_EONIG_INTERNAL },\r
+ { ONIGERR_STACK_BUG, REG_EONIG_INTERNAL },\r
+ { ONIGERR_UNDEFINED_BYTECODE, REG_EONIG_INTERNAL },\r
+ { ONIGERR_UNEXPECTED_BYTECODE, REG_EONIG_INTERNAL },\r
+ { ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED, REG_EONIG_BADARG },\r
+ { ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR, REG_EONIG_BADARG },\r
+ { ONIGERR_INVALID_ARGUMENT, REG_EONIG_BADARG },\r
+ { ONIGERR_END_PATTERN_AT_LEFT_BRACE, REG_EBRACE },\r
+ { ONIGERR_END_PATTERN_AT_LEFT_BRACKET, REG_EBRACK },\r
+ { ONIGERR_EMPTY_CHAR_CLASS, REG_ECTYPE },\r
+ { ONIGERR_PREMATURE_END_OF_CHAR_CLASS, REG_ECTYPE },\r
+ { ONIGERR_END_PATTERN_AT_ESCAPE, REG_EESCAPE },\r
+ { ONIGERR_END_PATTERN_AT_META, REG_EESCAPE },\r
+ { ONIGERR_END_PATTERN_AT_CONTROL, REG_EESCAPE },\r
+ { ONIGERR_META_CODE_SYNTAX, REG_BADPAT },\r
+ { ONIGERR_CONTROL_CODE_SYNTAX, REG_BADPAT },\r
+ { ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE, REG_ECTYPE },\r
+ { ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE, REG_ECTYPE },\r
+ { ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS, REG_ECTYPE },\r
+ { ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED, REG_BADRPT },\r
+ { ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID, REG_BADRPT },\r
+ { ONIGERR_NESTED_REPEAT_OPERATOR, REG_BADRPT },\r
+ { ONIGERR_UNMATCHED_CLOSE_PARENTHESIS, REG_EPAREN },\r
+ { ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS, REG_EPAREN },\r
+ { ONIGERR_END_PATTERN_IN_GROUP, REG_BADPAT },\r
+ { ONIGERR_UNDEFINED_GROUP_OPTION, REG_BADPAT },\r
+ { ONIGERR_INVALID_POSIX_BRACKET_TYPE, REG_BADPAT },\r
+ { ONIGERR_INVALID_LOOK_BEHIND_PATTERN, REG_BADPAT },\r
+ { ONIGERR_INVALID_REPEAT_RANGE_PATTERN, REG_BADPAT },\r
+ { ONIGERR_TOO_BIG_NUMBER, REG_BADPAT },\r
+ { ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE, REG_BADBR },\r
+ { ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE, REG_BADBR },\r
+ { ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS, REG_ECTYPE },\r
+ { ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE, REG_ECTYPE },\r
+ { ONIGERR_TOO_MANY_MULTI_BYTE_RANGES, REG_ECTYPE },\r
+ { ONIGERR_TOO_SHORT_MULTI_BYTE_STRING, REG_BADPAT },\r
+ { ONIGERR_TOO_BIG_BACKREF_NUMBER, REG_ESUBREG },\r
+ { ONIGERR_INVALID_BACKREF, REG_ESUBREG },\r
+ { ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED, REG_BADPAT },\r
+ { ONIGERR_TOO_BIG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },\r
+ { ONIGERR_TOO_LONG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },\r
+ { ONIGERR_INVALID_CODE_POINT_VALUE, REG_EONIG_BADWC },\r
+ { ONIGERR_EMPTY_GROUP_NAME, REG_BADPAT },\r
+ { ONIGERR_INVALID_GROUP_NAME, REG_BADPAT },\r
+ { ONIGERR_INVALID_CHAR_IN_GROUP_NAME, REG_BADPAT },\r
+ { ONIGERR_UNDEFINED_NAME_REFERENCE, REG_BADPAT },\r
+ { ONIGERR_UNDEFINED_GROUP_REFERENCE, REG_BADPAT },\r
+ { ONIGERR_MULTIPLEX_DEFINED_NAME, REG_BADPAT },\r
+ { ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL, REG_BADPAT },\r
+ { ONIGERR_NEVER_ENDING_RECURSION, REG_BADPAT },\r
+ { ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY, REG_BADPAT },\r
+ { ONIGERR_INVALID_CHAR_PROPERTY_NAME, REG_BADPAT },\r
+ { ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION, REG_EONIG_BADARG },\r
+ { ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT, REG_EONIG_THREAD }\r
+\r
+ };\r
+\r
+ int i;\r
+\r
+ if (code >= 0) return 0;\r
+\r
+ for (i = 0; i < (int )(sizeof(o2p) / sizeof(o2p[0])); i++) {\r
+ if (code == o2p[i].onig_err)\r
+ return o2p[i].posix_err;\r
+ }\r
+\r
+ return REG_EONIG_INTERNAL; /* but, unknown error code */\r
+}\r
+\r
+extern int\r
+regcomp(regex_t* reg, const char* pattern, int posix_options)\r
+{\r
+ int r, len;\r
+ OnigSyntaxType* syntax = OnigDefaultSyntax;\r
+ OnigOptionType options;\r
+\r
+ if ((posix_options & REG_EXTENDED) == 0)\r
+ syntax = ONIG_SYNTAX_POSIX_BASIC;\r
+\r
+ options = syntax->options;\r
+ if ((posix_options & REG_ICASE) != 0)\r
+ ONIG_OPTION_ON(options, ONIG_OPTION_IGNORECASE);\r
+ if ((posix_options & REG_NEWLINE) != 0) {\r
+ ONIG_OPTION_ON( options, ONIG_OPTION_NEGATE_SINGLELINE);\r
+ ONIG_OPTION_OFF(options, ONIG_OPTION_SINGLELINE);\r
+ }\r
+\r
+ reg->comp_options = posix_options;\r
+\r
+ ENC_STRING_LEN(OnigEncDefaultCharEncoding, pattern, len);\r
+ r = onig_new(PONIG_C(reg), (UChar* )pattern, (UChar* )(pattern + len),\r
+ options, OnigEncDefaultCharEncoding, syntax,\r
+ (OnigErrorInfo* )NULL);\r
+ if (r != ONIG_NORMAL) {\r
+ return onig2posix_error_code(r);\r
+ }\r
+\r
+ reg->re_nsub = ONIG_C(reg)->num_mem;\r
+ return 0;\r
+}\r
+\r
+extern int\r
+regexec(regex_t* reg, const char* str, size_t nmatch,\r
+ regmatch_t pmatch[], int posix_options)\r
+{\r
+ int r, i, len;\r
+ UChar* end;\r
+ regmatch_t* pm;\r
+ OnigOptionType options;\r
+\r
+ options = ONIG_OPTION_POSIX_REGION;\r
+ if ((posix_options & REG_NOTBOL) != 0) options |= ONIG_OPTION_NOTBOL;\r
+ if ((posix_options & REG_NOTEOL) != 0) options |= ONIG_OPTION_NOTEOL;\r
+\r
+ if (nmatch == 0 || (reg->comp_options & REG_NOSUB) != 0) {\r
+ pm = (regmatch_t* )NULL;\r
+ nmatch = 0;\r
+ }\r
+ else if ((int )nmatch < ONIG_C(reg)->num_mem + 1) {\r
+ pm = (regmatch_t* )xmalloc(sizeof(regmatch_t)\r
+ * (ONIG_C(reg)->num_mem + 1));\r
+ if (pm == NULL)\r
+ return REG_ESPACE;\r
+ }\r
+ else {\r
+ pm = pmatch;\r
+ }\r
+\r
+ ENC_STRING_LEN(ONIG_C(reg)->enc, str, len);\r
+ end = (UChar* )(str + len);\r
+ r = onig_search(ONIG_C(reg), (UChar* )str, end, (UChar* )str, end,\r
+ (OnigRegion* )pm, options);\r
+\r
+ if (r >= 0) {\r
+ r = 0; /* Match */\r
+ if (pm != pmatch && pm != NULL) {\r
+ xmemcpy(pmatch, pm, sizeof(regmatch_t) * nmatch);\r
+ }\r
+ }\r
+ else if (r == ONIG_MISMATCH) {\r
+ r = REG_NOMATCH;\r
+ for (i = 0; i < (int )nmatch; i++)\r
+ pmatch[i].rm_so = pmatch[i].rm_eo = ONIG_REGION_NOTPOS;\r
+ }\r
+ else {\r
+ r = onig2posix_error_code(r);\r
+ }\r
+\r
+ if (pm != pmatch && pm != NULL)\r
+ xfree(pm);\r
+\r
+#if 0\r
+ if (reg->re_nsub > nmatch - 1)\r
+ reg->re_nsub = (nmatch <= 1 ? 0 : nmatch - 1);\r
+#endif\r
+\r
+ return r;\r
+}\r
+\r
+extern void\r
+regfree(regex_t* reg)\r
+{\r
+ onig_free(ONIG_C(reg));\r
+}\r
+\r
+\r
+extern void\r
+reg_set_encoding(int mb_code)\r
+{\r
+ OnigEncoding enc;\r
+\r
+ switch (mb_code) {\r
+ case REG_POSIX_ENCODING_ASCII:\r
+ enc = ONIG_ENCODING_ASCII;\r
+ break;\r
+ case REG_POSIX_ENCODING_EUC_JP:\r
+ enc = ONIG_ENCODING_EUC_JP;\r
+ break;\r
+ case REG_POSIX_ENCODING_SJIS:\r
+ enc = ONIG_ENCODING_SJIS;\r
+ break;\r
+ case REG_POSIX_ENCODING_UTF8:\r
+ enc = ONIG_ENCODING_UTF8;\r
+ break;\r
+ case REG_POSIX_ENCODING_UTF16_BE:\r
+ enc = ONIG_ENCODING_UTF16_BE;\r
+ break;\r
+ case REG_POSIX_ENCODING_UTF16_LE:\r
+ enc = ONIG_ENCODING_UTF16_LE;\r
+ break;\r
+\r
+ default:\r
+ return ;\r
+ break;\r
+ }\r
+\r
+ onigenc_set_default_encoding(enc);\r
+}\r
+\r
+extern int\r
+reg_name_to_group_numbers(regex_t* reg,\r
+ const unsigned char* name, const unsigned char* name_end, int** nums)\r
+{\r
+ return onig_name_to_group_numbers(ONIG_C(reg), name, name_end, nums);\r
+}\r
+\r
+typedef struct {\r
+ int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*);\r
+ regex_t* reg;\r
+ void* arg;\r
+} i_wrap;\r
+\r
+static int\r
+i_wrapper(const UChar* name, const UChar* name_end, int ng, int* gs,\r
+ onig_regex_t* reg ARG_UNUSED, void* arg)\r
+{\r
+ i_wrap* warg = (i_wrap* )arg;\r
+\r
+ return (*warg->func)(name, name_end, ng, gs, warg->reg, warg->arg);\r
+}\r
+\r
+extern int\r
+reg_foreach_name(regex_t* reg,\r
+ int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*),\r
+ void* arg)\r
+{\r
+ i_wrap warg;\r
+\r
+ warg.func = func;\r
+ warg.reg = reg;\r
+ warg.arg = arg;\r
+\r
+ return onig_foreach_name(ONIG_C(reg), i_wrapper, &warg);\r
+}\r
+\r
+extern int\r
+reg_number_of_names(regex_t* reg)\r
+{\r
+ return onig_number_of_names(ONIG_C(reg));\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ regsyntax.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2006 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+OnigSyntaxType OnigSyntaxASIS = {\r
+ 0\r
+ , ONIG_SYN_OP2_INEFFECTIVE_ESCAPE\r
+ , 0\r
+ , ONIG_OPTION_NONE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxPosixBasic = {\r
+ ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |\r
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL )\r
+ , 0\r
+ , 0\r
+ , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxPosixExtended = {\r
+ ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_LPAREN_SUBEXP |\r
+ ONIG_SYN_OP_BRACE_INTERVAL |\r
+ ONIG_SYN_OP_PLUS_ONE_INF | ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_VBAR_ALT )\r
+ , 0\r
+ , ( ONIG_SYN_CONTEXT_INDEP_ANCHORS | \r
+ ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS | \r
+ ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP |\r
+ ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )\r
+ , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxEmacs = {\r
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC |\r
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL |\r
+ ONIG_SYN_OP_ESC_LPAREN_SUBEXP | ONIG_SYN_OP_ESC_VBAR_ALT |\r
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF |\r
+ ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_DECIMAL_BACKREF |\r
+ ONIG_SYN_OP_LINE_ANCHOR | ONIG_SYN_OP_ESC_CONTROL_CHARS )\r
+ , ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR\r
+ , ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC\r
+ , ONIG_OPTION_NONE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxGrep = {\r
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_POSIX_BRACKET |\r
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |\r
+ ONIG_SYN_OP_ESC_VBAR_ALT |\r
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_ESC_PLUS_ONE_INF |\r
+ ONIG_SYN_OP_ESC_QMARK_ZERO_ONE | ONIG_SYN_OP_LINE_ANCHOR |\r
+ ONIG_SYN_OP_ESC_W_WORD | ONIG_SYN_OP_ESC_B_WORD_BOUND |\r
+ ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | ONIG_SYN_OP_DECIMAL_BACKREF )\r
+ , 0\r
+ , ( ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC | ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC )\r
+ , ONIG_OPTION_NONE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxGnuRegex = {\r
+ SYN_GNU_REGEX_OP\r
+ , 0\r
+ , SYN_GNU_REGEX_BV\r
+ , ONIG_OPTION_NONE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxJava = {\r
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\r
+ ONIG_SYN_OP_ESC_CONTROL_CHARS | ONIG_SYN_OP_ESC_C_CONTROL |\r
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 )\r
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\r
+ , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE | ONIG_SYN_OP2_QMARK_GROUP_EFFECT |\r
+ ONIG_SYN_OP2_OPTION_PERL | ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\r
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL | ONIG_SYN_OP2_CCLASS_SET_OP |\r
+ ONIG_SYN_OP2_ESC_V_VTAB | ONIG_SYN_OP2_ESC_U_HEX4 |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY )\r
+ , ( SYN_GNU_REGEX_BV | ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND )\r
+ , ONIG_OPTION_SINGLELINE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+OnigSyntaxType OnigSyntaxPerl = {\r
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\r
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\r
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\r
+ ONIG_SYN_OP_ESC_C_CONTROL )\r
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\r
+ , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |\r
+ ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT )\r
+ , SYN_GNU_REGEX_BV\r
+ , ONIG_OPTION_SINGLELINE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+/* Perl + named group */\r
+OnigSyntaxType OnigSyntaxPerl_NG = {\r
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\r
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\r
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\r
+ ONIG_SYN_OP_ESC_C_CONTROL )\r
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\r
+ , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |\r
+ ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY |\r
+ ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\r
+ ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP |\r
+ ONIG_SYN_OP2_ESC_K_NAMED_BACKREF |\r
+ ONIG_SYN_OP2_ESC_G_SUBEXP_CALL )\r
+ , ( SYN_GNU_REGEX_BV |\r
+ ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP |\r
+ ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME )\r
+ , ONIG_OPTION_SINGLELINE\r
+ ,\r
+ {\r
+ (OnigCodePoint )'\\' /* esc */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\r
+ , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\r
+ }\r
+};\r
+\r
+\r
+\r
+extern int\r
+onig_set_default_syntax(OnigSyntaxType* syntax)\r
+{\r
+ if (IS_NULL(syntax))\r
+ syntax = ONIG_SYNTAX_RUBY;\r
+\r
+ OnigDefaultSyntax = syntax;\r
+ return 0;\r
+}\r
+\r
+extern void\r
+onig_copy_syntax(OnigSyntaxType* to, OnigSyntaxType* from)\r
+{\r
+ *to = *from;\r
+}\r
+\r
+extern void\r
+onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)\r
+{\r
+ syntax->op = op;\r
+}\r
+\r
+extern void\r
+onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)\r
+{\r
+ syntax->op2 = op2;\r
+}\r
+\r
+extern void\r
+onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)\r
+{\r
+ syntax->behavior = behavior;\r
+}\r
+\r
+extern void\r
+onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)\r
+{\r
+ syntax->options = options;\r
+}\r
+\r
+extern unsigned int\r
+onig_get_syntax_op(OnigSyntaxType* syntax)\r
+{\r
+ return syntax->op;\r
+}\r
+\r
+extern unsigned int\r
+onig_get_syntax_op2(OnigSyntaxType* syntax)\r
+{\r
+ return syntax->op2;\r
+}\r
+\r
+extern unsigned int\r
+onig_get_syntax_behavior(OnigSyntaxType* syntax)\r
+{\r
+ return syntax->behavior;\r
+}\r
+\r
+extern OnigOptionType\r
+onig_get_syntax_options(OnigSyntaxType* syntax)\r
+{\r
+ return syntax->options;\r
+}\r
+\r
+#ifdef USE_VARIABLE_META_CHARS\r
+extern int onig_set_meta_char(OnigSyntaxType* enc,\r
+ unsigned int what, OnigCodePoint code)\r
+{\r
+ switch (what) {\r
+ case ONIG_META_CHAR_ESCAPE:\r
+ enc->meta_char_table.esc = code;\r
+ break;\r
+ case ONIG_META_CHAR_ANYCHAR:\r
+ enc->meta_char_table.anychar = code;\r
+ break;\r
+ case ONIG_META_CHAR_ANYTIME:\r
+ enc->meta_char_table.anytime = code;\r
+ break;\r
+ case ONIG_META_CHAR_ZERO_OR_ONE_TIME:\r
+ enc->meta_char_table.zero_or_one_time = code;\r
+ break;\r
+ case ONIG_META_CHAR_ONE_OR_MORE_TIME:\r
+ enc->meta_char_table.one_or_more_time = code;\r
+ break;\r
+ case ONIG_META_CHAR_ANYCHAR_ANYTIME:\r
+ enc->meta_char_table.anychar_anytime = code;\r
+ break;\r
+ default:\r
+ return ONIGERR_INVALID_ARGUMENT;\r
+ break;\r
+ }\r
+ return 0;\r
+}\r
+#endif /* USE_VARIABLE_META_CHARS */\r
--- /dev/null
+/**********************************************************************\r
+ regtrav.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2004 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#include "regint.h"\r
+\r
+#ifdef USE_CAPTURE_HISTORY\r
+\r
+static int\r
+capture_tree_traverse(OnigCaptureTreeNode* node, int at,\r
+ int(*callback_func)(int,int,int,int,int,void*),\r
+ int level, void* arg)\r
+{\r
+ int r, i;\r
+\r
+ if (node == (OnigCaptureTreeNode* )0)\r
+ return 0;\r
+\r
+ if ((at & ONIG_TRAVERSE_CALLBACK_AT_FIRST) != 0) {\r
+ r = (*callback_func)(node->group, node->beg, node->end,\r
+ level, ONIG_TRAVERSE_CALLBACK_AT_FIRST, arg);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ for (i = 0; i < node->num_childs; i++) {\r
+ r = capture_tree_traverse(node->childs[i], at,\r
+ callback_func, level + 1, arg);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ if ((at & ONIG_TRAVERSE_CALLBACK_AT_LAST) != 0) {\r
+ r = (*callback_func)(node->group, node->beg, node->end,\r
+ level, ONIG_TRAVERSE_CALLBACK_AT_LAST, arg);\r
+ if (r != 0) return r;\r
+ }\r
+\r
+ return 0;\r
+}\r
+#endif /* USE_CAPTURE_HISTORY */\r
+\r
+extern int\r
+onig_capture_tree_traverse(OnigRegion* region, int at,\r
+ int(*callback_func)(int,int,int,int,int,void*), void* arg)\r
+{\r
+#ifdef USE_CAPTURE_HISTORY\r
+ return capture_tree_traverse(region->history_root, at,\r
+ callback_func, 0, arg);\r
+#else\r
+ return ONIG_NO_SUPPORT_CONFIG;\r
+#endif\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ regversion.c - Oniguruma (regular expression library)\r
+**********************************************************************/\r
+/*-\r
+ * Copyright (c) 2002-2008 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+//#include "config.h"\r
+#include "oniguruma.h"\r
+//#include <stdio.h>\r
+\r
+extern const char*\r
+onig_version(void)\r
+{\r
+ static char s[12];\r
+\r
+ sprintf(s, "%d.%d.%d",\r
+ ONIGURUMA_VERSION_MAJOR,\r
+ ONIGURUMA_VERSION_MINOR,\r
+ ONIGURUMA_VERSION_TEENY);\r
+ return s;\r
+}\r
+\r
+extern const char*\r
+onig_copyright(void)\r
+{\r
+ static char s[58];\r
+\r
+ sprintf(s, "Oniguruma %d.%d.%d : Copyright (C) 2002-2008 K.Kosako",\r
+ ONIGURUMA_VERSION_MAJOR,\r
+ ONIGURUMA_VERSION_MINOR,\r
+ ONIGURUMA_VERSION_TEENY);\r
+ return s;\r
+}\r
--- /dev/null
+/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */\r
+\r
+/* static char sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible"; */\r
+\r
+//#include <stdio.h>\r
+//#include <stdlib.h>\r
+//#include <string.h>\r
+#include "OnigurumaUefiPort.h"\r
+\r
+#ifdef _WIN32\r
+#include <malloc.h>\r
+#endif\r
+\r
+#include "regint.h"\r
+#include "st.h"\r
+\r
+typedef struct st_table_entry st_table_entry;\r
+\r
+struct st_table_entry {\r
+ unsigned int hash;\r
+ st_data_t key;\r
+ st_data_t record;\r
+ st_table_entry *next;\r
+};\r
+\r
+#define ST_DEFAULT_MAX_DENSITY 5\r
+#define ST_DEFAULT_INIT_TABLE_SIZE 11\r
+\r
+ /*\r
+ * DEFAULT_MAX_DENSITY is the default for the largest we allow the\r
+ * average number of items per bin before increasing the number of\r
+ * bins\r
+ *\r
+ * DEFAULT_INIT_TABLE_SIZE is the default for the number of bins\r
+ * allocated initially\r
+ *\r
+ */\r
+\r
+static int numcmp(long, long);\r
+static int numhash(long);\r
+static struct st_hash_type type_numhash = {\r
+ numcmp,\r
+ numhash,\r
+};\r
+\r
+/* extern int strcmp(const char *, const char *); */\r
+static int strhash(const char *);\r
+static struct st_hash_type type_strhash = {\r
+ strcmp,\r
+ strhash,\r
+};\r
+\r
+static void rehash(st_table *);\r
+\r
+#define alloc(type) (type*)xmalloc((unsigned)sizeof(type))\r
+#define Calloc(n,s) (char*)xcalloc((n),(s))\r
+\r
+#define EQUAL(table,x,y) ((x)==(y) || (*table->type->compare)((x),(y)) == 0)\r
+\r
+#define do_hash(key,table) (unsigned int)(*(table)->type->hash)((key))\r
+#define do_hash_bin(key,table) (do_hash(key, table)%(table)->num_bins)\r
+\r
+/*\r
+ * MINSIZE is the minimum size of a dictionary.\r
+ */\r
+\r
+#define MINSIZE 8\r
+\r
+/*\r
+Table of prime numbers 2^n+a, 2<=n<=30.\r
+*/\r
+static const long primes[] = {\r
+ 8 + 3,\r
+ 16 + 3,\r
+ 32 + 5,\r
+ 64 + 3,\r
+ 128 + 3,\r
+ 256 + 27,\r
+ 512 + 9,\r
+ 1024 + 9,\r
+ 2048 + 5,\r
+ 4096 + 3,\r
+ 8192 + 27,\r
+ 16384 + 43,\r
+ 32768 + 3,\r
+ 65536 + 45,\r
+ 131072 + 29,\r
+ 262144 + 3,\r
+ 524288 + 21,\r
+ 1048576 + 7,\r
+ 2097152 + 17,\r
+ 4194304 + 15,\r
+ 8388608 + 9,\r
+ 16777216 + 43,\r
+ 33554432 + 35,\r
+ 67108864 + 15,\r
+ 134217728 + 29,\r
+ 268435456 + 3,\r
+ 536870912 + 11,\r
+ 1073741824 + 85,\r
+ 0\r
+};\r
+\r
+static int\r
+new_size(size)\r
+ int size;\r
+{\r
+ int i;\r
+\r
+#if 0\r
+ for (i=3; i<31; i++) {\r
+ if ((1<<i) > size) return 1<<i;\r
+ }\r
+ return -1;\r
+#else\r
+ int newsize;\r
+\r
+ for (i = 0, newsize = MINSIZE;\r
+ i < (int )(sizeof(primes)/sizeof(primes[0]));\r
+ i++, newsize <<= 1)\r
+ {\r
+ if (newsize > size) return primes[i];\r
+ }\r
+ /* Ran out of polynomials */\r
+ return -1; /* should raise exception */\r
+#endif\r
+}\r
+\r
+#ifdef HASH_LOG\r
+static int collision = 0;\r
+static int init_st = 0;\r
+\r
+static void\r
+stat_col()\r
+{\r
+ FILE *f = fopen("/tmp/col", "w");\r
+ fprintf(f, "collision: %d\n", collision);\r
+ fclose(f);\r
+}\r
+#endif\r
+\r
+st_table*\r
+st_init_table_with_size(type, size)\r
+ struct st_hash_type *type;\r
+ int size;\r
+{\r
+ st_table *tbl;\r
+\r
+#ifdef HASH_LOG\r
+ if (init_st == 0) {\r
+ init_st = 1;\r
+ atexit(stat_col);\r
+ }\r
+#endif\r
+\r
+ size = new_size(size); /* round up to prime number */\r
+\r
+ tbl = alloc(st_table);\r
+ tbl->type = type;\r
+ tbl->num_entries = 0;\r
+ tbl->num_bins = size;\r
+ tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));\r
+\r
+ return tbl;\r
+}\r
+\r
+st_table*\r
+st_init_table(type)\r
+ struct st_hash_type *type;\r
+{\r
+ return st_init_table_with_size(type, 0);\r
+}\r
+\r
+st_table*\r
+st_init_numtable(void)\r
+{\r
+ return st_init_table(&type_numhash);\r
+}\r
+\r
+st_table*\r
+st_init_numtable_with_size(size)\r
+ int size;\r
+{\r
+ return st_init_table_with_size(&type_numhash, size);\r
+}\r
+\r
+st_table*\r
+st_init_strtable(void)\r
+{\r
+ return st_init_table(&type_strhash);\r
+}\r
+\r
+st_table*\r
+st_init_strtable_with_size(size)\r
+ int size;\r
+{\r
+ return st_init_table_with_size(&type_strhash, size);\r
+}\r
+\r
+void\r
+st_free_table(table)\r
+ st_table *table;\r
+{\r
+ register st_table_entry *ptr, *next;\r
+ int i;\r
+\r
+ for(i = 0; i < table->num_bins; i++) {\r
+ ptr = table->bins[i];\r
+ while (ptr != 0) {\r
+ next = ptr->next;\r
+ free(ptr);\r
+ ptr = next;\r
+ }\r
+ }\r
+ free(table->bins);\r
+ free(table);\r
+}\r
+\r
+#define PTR_NOT_EQUAL(table, ptr, hash_val, key) \\r
+((ptr) != 0 && (ptr->hash != (hash_val) || !EQUAL((table), (key), (ptr)->key)))\r
+\r
+#ifdef HASH_LOG\r
+#define COLLISION collision++\r
+#else\r
+#define COLLISION\r
+#endif\r
+\r
+#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\\r
+ bin_pos = hash_val%(table)->num_bins;\\r
+ ptr = (table)->bins[bin_pos];\\r
+ if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {\\r
+ COLLISION;\\r
+ while (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\\r
+ ptr = ptr->next;\\r
+ }\\r
+ ptr = ptr->next;\\r
+ }\\r
+} while (0)\r
+\r
+int\r
+st_lookup(table, key, value)\r
+ st_table *table;\r
+ register st_data_t key;\r
+ st_data_t *value;\r
+{\r
+ unsigned int hash_val, bin_pos;\r
+ register st_table_entry *ptr;\r
+\r
+ hash_val = do_hash(key, table);\r
+ FIND_ENTRY(table, ptr, hash_val, bin_pos);\r
+\r
+ if (ptr == 0) {\r
+ return 0;\r
+ }\r
+ else {\r
+ if (value != 0) *value = ptr->record;\r
+ return 1;\r
+ }\r
+}\r
+\r
+#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\\r
+do {\\r
+ st_table_entry *entry;\\r
+ if (table->num_entries/(table->num_bins) > ST_DEFAULT_MAX_DENSITY) {\\r
+ rehash(table);\\r
+ bin_pos = hash_val % table->num_bins;\\r
+ }\\r
+ \\r
+ entry = alloc(st_table_entry);\\r
+ \\r
+ entry->hash = hash_val;\\r
+ entry->key = key;\\r
+ entry->record = value;\\r
+ entry->next = table->bins[bin_pos];\\r
+ table->bins[bin_pos] = entry;\\r
+ table->num_entries++;\\r
+} while (0)\r
+\r
+int\r
+st_insert(table, key, value)\r
+ register st_table *table;\r
+ register st_data_t key;\r
+ st_data_t value;\r
+{\r
+ unsigned int hash_val, bin_pos;\r
+ register st_table_entry *ptr;\r
+\r
+ hash_val = do_hash(key, table);\r
+ FIND_ENTRY(table, ptr, hash_val, bin_pos);\r
+\r
+ if (ptr == 0) {\r
+ ADD_DIRECT(table, key, value, hash_val, bin_pos);\r
+ return 0;\r
+ }\r
+ else {\r
+ ptr->record = value;\r
+ return 1;\r
+ }\r
+}\r
+\r
+void\r
+st_add_direct(table, key, value)\r
+ st_table *table;\r
+ st_data_t key;\r
+ st_data_t value;\r
+{\r
+ unsigned int hash_val, bin_pos;\r
+\r
+ hash_val = do_hash(key, table);\r
+ bin_pos = hash_val % table->num_bins;\r
+ ADD_DIRECT(table, key, value, hash_val, bin_pos);\r
+}\r
+\r
+static void\r
+rehash(table)\r
+ register st_table *table;\r
+{\r
+ register st_table_entry *ptr, *next, **new_bins;\r
+ int i, old_num_bins = table->num_bins, new_num_bins;\r
+ unsigned int hash_val;\r
+\r
+ new_num_bins = new_size(old_num_bins+1);\r
+ new_bins = (st_table_entry**)Calloc(new_num_bins, sizeof(st_table_entry*));\r
+\r
+ for(i = 0; i < old_num_bins; i++) {\r
+ ptr = table->bins[i];\r
+ while (ptr != 0) {\r
+ next = ptr->next;\r
+ hash_val = ptr->hash % new_num_bins;\r
+ ptr->next = new_bins[hash_val];\r
+ new_bins[hash_val] = ptr;\r
+ ptr = next;\r
+ }\r
+ }\r
+ free(table->bins);\r
+ table->num_bins = new_num_bins;\r
+ table->bins = new_bins;\r
+}\r
+\r
+st_table*\r
+st_copy(old_table)\r
+ st_table *old_table;\r
+{\r
+ st_table *new_table;\r
+ st_table_entry *ptr, *entry;\r
+ int i, num_bins = old_table->num_bins;\r
+\r
+ new_table = alloc(st_table);\r
+ if (new_table == 0) {\r
+ return 0;\r
+ }\r
+\r
+ *new_table = *old_table;\r
+ new_table->bins = (st_table_entry**)\r
+ Calloc((unsigned)num_bins, sizeof(st_table_entry*));\r
+\r
+ if (new_table->bins == 0) {\r
+ free(new_table);\r
+ return 0;\r
+ }\r
+\r
+ for(i = 0; i < num_bins; i++) {\r
+ new_table->bins[i] = 0;\r
+ ptr = old_table->bins[i];\r
+ while (ptr != 0) {\r
+ entry = alloc(st_table_entry);\r
+ if (entry == 0) {\r
+ free(new_table->bins);\r
+ free(new_table);\r
+ return 0;\r
+ }\r
+ *entry = *ptr;\r
+ entry->next = new_table->bins[i];\r
+ new_table->bins[i] = entry;\r
+ ptr = ptr->next;\r
+ }\r
+ }\r
+ return new_table;\r
+}\r
+\r
+int\r
+st_delete(table, key, value)\r
+ register st_table *table;\r
+ register st_data_t *key;\r
+ st_data_t *value;\r
+{\r
+ unsigned int hash_val;\r
+ st_table_entry *tmp;\r
+ register st_table_entry *ptr;\r
+\r
+ hash_val = do_hash_bin(*key, table);\r
+ ptr = table->bins[hash_val];\r
+\r
+ if (ptr == 0) {\r
+ if (value != 0) *value = 0;\r
+ return 0;\r
+ }\r
+\r
+ if (EQUAL(table, *key, ptr->key)) {\r
+ table->bins[hash_val] = ptr->next;\r
+ table->num_entries--;\r
+ if (value != 0) *value = ptr->record;\r
+ *key = ptr->key;\r
+ free(ptr);\r
+ return 1;\r
+ }\r
+\r
+ for(; ptr->next != 0; ptr = ptr->next) {\r
+ if (EQUAL(table, ptr->next->key, *key)) {\r
+ tmp = ptr->next;\r
+ ptr->next = ptr->next->next;\r
+ table->num_entries--;\r
+ if (value != 0) *value = tmp->record;\r
+ *key = tmp->key;\r
+ free(tmp);\r
+ return 1;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int\r
+st_delete_safe(table, key, value, never)\r
+ register st_table *table;\r
+ register st_data_t *key;\r
+ st_data_t *value;\r
+ st_data_t never;\r
+{\r
+ unsigned int hash_val;\r
+ register st_table_entry *ptr;\r
+\r
+ hash_val = do_hash_bin(*key, table);\r
+ ptr = table->bins[hash_val];\r
+\r
+ if (ptr == 0) {\r
+ if (value != 0) *value = 0;\r
+ return 0;\r
+ }\r
+\r
+ for(; ptr != 0; ptr = ptr->next) {\r
+ if ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {\r
+ table->num_entries--;\r
+ *key = ptr->key;\r
+ if (value != 0) *value = ptr->record;\r
+ ptr->key = ptr->record = never;\r
+ return 1;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int\r
+#if defined(__GNUC__)\r
+delete_never(st_data_t key __attribute__ ((unused)), st_data_t value,\r
+ st_data_t never)\r
+#else\r
+delete_never(key, value, never)\r
+ st_data_t key, value, never;\r
+#endif\r
+{\r
+ if (value == never) return ST_DELETE;\r
+ return ST_CONTINUE;\r
+}\r
+\r
+void\r
+st_cleanup_safe(table, never)\r
+ st_table *table;\r
+ st_data_t never;\r
+{\r
+ int num_entries = table->num_entries;\r
+\r
+ st_foreach(table, delete_never, never);\r
+ table->num_entries = num_entries;\r
+}\r
+\r
+int\r
+st_foreach(table, func, arg)\r
+ st_table *table;\r
+ int (*func)();\r
+ st_data_t arg;\r
+{\r
+ st_table_entry *ptr, *last, *tmp;\r
+ enum st_retval retval;\r
+ int i;\r
+\r
+ for(i = 0; i < table->num_bins; i++) {\r
+ last = 0;\r
+ for(ptr = table->bins[i]; ptr != 0;) {\r
+ retval = (*func)(ptr->key, ptr->record, arg);\r
+ switch (retval) {\r
+ case ST_CHECK: /* check if hash is modified during iteration */\r
+ tmp = 0;\r
+ if (i < table->num_bins) {\r
+ for (tmp = table->bins[i]; tmp; tmp=tmp->next) {\r
+ if (tmp == ptr) break;\r
+ }\r
+ }\r
+ if (!tmp) {\r
+ /* call func with error notice */\r
+ return 1;\r
+ }\r
+ /* fall through */\r
+ case ST_CONTINUE:\r
+ last = ptr;\r
+ ptr = ptr->next;\r
+ break;\r
+ case ST_STOP:\r
+ return 0;\r
+ case ST_DELETE:\r
+ tmp = ptr;\r
+ if (last == 0) {\r
+ table->bins[i] = ptr->next;\r
+ }\r
+ else {\r
+ last->next = ptr->next;\r
+ }\r
+ ptr = ptr->next;\r
+ free(tmp);\r
+ table->num_entries--;\r
+ }\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int\r
+strhash(string)\r
+ register const char *string;\r
+{\r
+ register int c;\r
+\r
+#ifdef HASH_ELFHASH\r
+ register unsigned int h = 0, g;\r
+\r
+ while ((c = *string++) != '\0') {\r
+ h = ( h << 4 ) + c;\r
+ if ( g = h & 0xF0000000 )\r
+ h ^= g >> 24;\r
+ h &= ~g;\r
+ }\r
+ return h;\r
+#elif HASH_PERL\r
+ register int val = 0;\r
+\r
+ while ((c = *string++) != '\0') {\r
+ val += c;\r
+ val += (val << 10);\r
+ val ^= (val >> 6);\r
+ }\r
+ val += (val << 3);\r
+ val ^= (val >> 11);\r
+\r
+ return val + (val << 15);\r
+#else\r
+ register int val = 0;\r
+\r
+ while ((c = *string++) != '\0') {\r
+ val = val*997 + c;\r
+ }\r
+\r
+ return val + (val>>5);\r
+#endif\r
+}\r
+\r
+static int\r
+numcmp(x, y)\r
+ long x, y;\r
+{\r
+ return x != y;\r
+}\r
+\r
+static int\r
+numhash(n)\r
+ long n;\r
+{\r
+ return n;\r
+}\r
--- /dev/null
+/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */\r
+\r
+/* @(#) st.h 5.1 89/12/14 */\r
+\r
+#ifndef ST_INCLUDED\r
+\r
+#define ST_INCLUDED\r
+\r
+#ifdef _WIN32\r
+# include <windows.h>\r
+typedef ULONG_PTR st_data_t;\r
+#else\r
+typedef unsigned long st_data_t;\r
+#endif\r
+#define ST_DATA_T_DEFINED\r
+\r
+typedef struct st_table st_table;\r
+\r
+struct st_hash_type {\r
+ int (*compare)();\r
+ int (*hash)();\r
+};\r
+\r
+struct st_table {\r
+ struct st_hash_type *type;\r
+ int num_bins;\r
+ int num_entries;\r
+ struct st_table_entry **bins;\r
+};\r
+\r
+#define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0)\r
+\r
+enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE, ST_CHECK};\r
+\r
+#ifndef _\r
+# define _(args) args\r
+#endif\r
+#ifndef ANYARGS\r
+# ifdef __cplusplus\r
+# define ANYARGS ...\r
+# else\r
+# define ANYARGS\r
+# endif\r
+#endif\r
+\r
+st_table *st_init_table _((struct st_hash_type *));\r
+st_table *st_init_table_with_size _((struct st_hash_type *, int));\r
+st_table *st_init_numtable _((void));\r
+st_table *st_init_numtable_with_size _((int));\r
+st_table *st_init_strtable _((void));\r
+st_table *st_init_strtable_with_size _((int));\r
+int st_delete _((st_table *, st_data_t *, st_data_t *));\r
+int st_delete_safe _((st_table *, st_data_t *, st_data_t *, st_data_t));\r
+int st_insert _((st_table *, st_data_t, st_data_t));\r
+int st_lookup _((st_table *, st_data_t, st_data_t *));\r
+int st_foreach _((st_table *, int (*)(ANYARGS), st_data_t));\r
+void st_add_direct _((st_table *, st_data_t, st_data_t));\r
+void st_free_table _((st_table *));\r
+void st_cleanup_safe _((st_table *, st_data_t));\r
+st_table *st_copy _((st_table *));\r
+\r
+#define ST_NUMCMP ((int (*)()) 0)\r
+#define ST_NUMHASH ((int (*)()) -2)\r
+\r
+#define st_numcmp ST_NUMCMP\r
+#define st_numhash ST_NUMHASH\r
+\r
+#endif /* ST_INCLUDED */\r
--- /dev/null
+/**\r
+ @file\r
+\r
+ EFI_REGULAR_EXPRESSION_PROTOCOL Implementation\r
+\r
+ Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+\r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License that accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+\r
+#include "RegularExpressionDxe.h"\r
+\r
+STATIC\r
+EFI_REGEX_SYNTAX_TYPE * CONST mSupportedSyntaxes[] = {\r
+ &gEfiRegexSyntaxTypePosixExtendedGuid,\r
+ &gEfiRegexSyntaxTypePerlGuid\r
+};\r
+\r
+STATIC\r
+EFI_REGULAR_EXPRESSION_PROTOCOL mProtocolInstance = {\r
+ RegularExpressionMatch,\r
+ RegularExpressionGetInfo\r
+};\r
+\r
+\r
+\r
+#define CHAR16_ENCODING ONIG_ENCODING_UTF16_LE\r
+\r
+/**\r
+ Call the Oniguruma regex match API.\r
+\r
+ Same parameters as RegularExpressionMatch, except SyntaxType is required.\r
+\r
+ @retval EFI_SUCCESS Regex compilation and match completed successfully.\r
+ @retval EFI_DEVICE_ERROR Regex compilation failed.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+OnigurumaMatch (\r
+ IN CHAR16 *String,\r
+ IN CHAR16 *Pattern,\r
+ IN EFI_REGEX_SYNTAX_TYPE *SyntaxType,\r
+ OUT BOOLEAN *Result,\r
+ OUT EFI_REGEX_CAPTURE **Captures, OPTIONAL\r
+ OUT UINTN *CapturesCount\r
+ )\r
+{\r
+ regex_t *OnigRegex;\r
+ OnigSyntaxType *OnigSyntax;\r
+ OnigRegion *Region;\r
+ INT32 OnigResult;\r
+ OnigErrorInfo ErrorInfo;\r
+ CHAR8 ErrorMessage[ONIG_MAX_ERROR_MESSAGE_LEN];\r
+ UINT32 Index;\r
+ OnigUChar *Start;\r
+\r
+ //\r
+ // Detemine the internal syntax type\r
+ //\r
+ OnigSyntax = ONIG_SYNTAX_DEFAULT;\r
+ if (CompareGuid (SyntaxType, &gEfiRegexSyntaxTypePosixExtendedGuid)) {\r
+ OnigSyntax = ONIG_SYNTAX_POSIX_EXTENDED;\r
+ } else if (CompareGuid (SyntaxType, &gEfiRegexSyntaxTypePerlGuid)) {\r
+ OnigSyntax = ONIG_SYNTAX_PERL;\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "Unsupported regex syntax - using default\n"));\r
+ ASSERT (FALSE);\r
+ }\r
+\r
+ //\r
+ // Compile pattern\r
+ //\r
+ Start = (OnigUChar*)Pattern;\r
+ OnigResult = onig_new (\r
+ &OnigRegex,\r
+ Start,\r
+ Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),\r
+ ONIG_OPTION_DEFAULT,\r
+ CHAR16_ENCODING,\r
+ OnigSyntax,\r
+ &ErrorInfo\r
+ );\r
+\r
+ if (OnigResult != ONIG_NORMAL) {\r
+ onig_error_code_to_str (ErrorMessage, OnigResult, &ErrorInfo);\r
+ DEBUG ((DEBUG_ERROR, "Regex compilation failed: %a\n", ErrorMessage));\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
+ //\r
+ // Try to match\r
+ //\r
+ Start = (OnigUChar*)String;\r
+ Region = onig_region_new ();\r
+ OnigResult = onig_search (\r
+ OnigRegex,\r
+ Start,\r
+ Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),\r
+ Start,\r
+ Start + onigenc_str_bytelen_null (CHAR16_ENCODING, Start),\r
+ Region,\r
+ ONIG_OPTION_NONE\r
+ );\r
+ if (OnigResult >= 0) {\r
+ *Result = TRUE;\r
+ } else {\r
+ *Result = FALSE;\r
+ if (OnigResult != ONIG_MISMATCH) {\r
+ onig_error_code_to_str (ErrorMessage, OnigResult);\r
+ DEBUG ((DEBUG_ERROR, "Regex match failed: %a\n", ErrorMessage));\r
+ }\r
+ }\r
+\r
+ //\r
+ // If successful, copy out the region (capture) information\r
+ //\r
+ if (*Result && Captures != NULL) {\r
+ *CapturesCount = Region->num_regs;\r
+ *Captures = AllocatePool (*CapturesCount * sizeof(**Captures));\r
+ if (*Captures != NULL) {\r
+ for (Index = 0; Index < *CapturesCount; ++Index) {\r
+ //\r
+ // Region beg/end values represent bytes, not characters\r
+ //\r
+ (*Captures)[Index].CapturePtr = (CHAR16*)((UINTN)String + Region->beg[Index]);\r
+ (*Captures)[Index].Length = (Region->end[Index] - Region->beg[Index]) / sizeof(CHAR16);\r
+ }\r
+ }\r
+ }\r
+\r
+ onig_region_free (Region, 1);\r
+ onig_free (OnigRegex);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Returns information about the regular expression syntax types supported\r
+ by the implementation.\r
+\r
+ This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL\r
+ instance.\r
+\r
+ RegExSyntaxTypeListSize On input, the size in bytes of RegExSyntaxTypeList.\r
+ On output with a return code of EFI_SUCCESS, the\r
+ size in bytes of the data returned in\r
+ RegExSyntaxTypeList. On output with a return code\r
+ of EFI_BUFFER_TOO_SMALL, the size of\r
+ RegExSyntaxTypeList required to obtain the list.\r
+\r
+ RegExSyntaxTypeList A caller-allocated memory buffer filled by the\r
+ driver with one EFI_REGEX_SYNTAX_TYPE element\r
+ for each supported Regular expression syntax\r
+ type. The list must not change across multiple\r
+ calls to the same driver. The first syntax\r
+ type in the list is the default type for the\r
+ driver.\r
+\r
+ @retval EFI_SUCCESS The regular expression syntax types list\r
+ was returned successfully.\r
+ @retval EFI_UNSUPPORTED The service is not supported by this driver.\r
+ @retval EFI_DEVICE_ERROR The list of syntax types could not be\r
+ retrieved due to a hardware or firmware error.\r
+ @retval EFI_BUFFER_TOO_SMALL The buffer RegExSyntaxTypeList is too small\r
+ to hold the result.\r
+ @retval EFI_INVALID_PARAMETER RegExSyntaxTypeListSize is NULL\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegularExpressionGetInfo (\r
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *This,\r
+ IN OUT UINTN *RegExSyntaxTypeListSize,\r
+ OUT EFI_REGEX_SYNTAX_TYPE *RegExSyntaxTypeList\r
+ )\r
+{\r
+ UINTN SyntaxSize;\r
+ UINTN Index;\r
+\r
+ if (This == NULL || RegExSyntaxTypeListSize == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (*RegExSyntaxTypeListSize != 0 && RegExSyntaxTypeList == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ SyntaxSize = ARRAY_SIZE (mSupportedSyntaxes) * sizeof(**mSupportedSyntaxes);\r
+\r
+ if (*RegExSyntaxTypeListSize < SyntaxSize) {\r
+ *RegExSyntaxTypeListSize = SyntaxSize;\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ for (Index = 0; Index < ARRAY_SIZE (mSupportedSyntaxes); ++Index) {\r
+ CopyMem (&RegExSyntaxTypeList[Index], mSupportedSyntaxes[Index], sizeof(**mSupportedSyntaxes));\r
+ }\r
+ *RegExSyntaxTypeListSize = SyntaxSize;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Checks if the input string matches to the regular expression pattern.\r
+\r
+ This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL instance.\r
+ Type EFI_REGULAR_EXPRESSION_PROTOCOL is defined in Section\r
+ XYZ.\r
+\r
+ String A pointer to a NULL terminated string to match against the\r
+ regular expression string specified by Pattern.\r
+\r
+ Pattern A pointer to a NULL terminated string that represents the\r
+ regular expression.\r
+\r
+ SyntaxType A pointer to the EFI_REGEX_SYNTAX_TYPE that identifies the\r
+ regular expression syntax type to use. May be NULL in which\r
+ case the function will use its default regular expression\r
+ syntax type.\r
+\r
+ Result On return, points to TRUE if String fully matches against\r
+ the regular expression Pattern using the regular expression\r
+ SyntaxType. Otherwise, points to FALSE.\r
+\r
+ Captures A Pointer to an array of EFI_REGEX_CAPTURE objects to receive\r
+ the captured groups in the event of a match. The full\r
+ sub-string match is put in Captures[0], and the results of N\r
+ capturing groups are put in Captures[1:N]. If Captures is\r
+ NULL, then this function doesn't allocate the memory for the\r
+ array and does not build up the elements. It only returns the\r
+ number of matching patterns in CapturesCount. If Captures is\r
+ not NULL, this function returns a pointer to an array and\r
+ builds up the elements in the array. CapturesCount is also\r
+ updated to the number of matching patterns found. It is the\r
+ caller's responsibility to free the memory pool in Captures\r
+ and in each CapturePtr in the array elements.\r
+\r
+ CapturesCount On output, CapturesCount is the number of matching patterns\r
+ found in String. Zero means no matching patterns were found\r
+ in the string.\r
+\r
+ @retval EFI_SUCCESS The regular expression string matching\r
+ completed successfully.\r
+ @retval EFI_UNSUPPORTED The regular expression syntax specified by\r
+ SyntaxType is not supported by this driver.\r
+ @retval EFI_DEVICE_ERROR The regular expression string matching\r
+ failed due to a hardware or firmware error.\r
+ @retval EFI_INVALID_PARAMETER String, Pattern, Result, or CapturesCountis\r
+ NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegularExpressionMatch (\r
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *This,\r
+ IN CHAR16 *String,\r
+ IN CHAR16 *Pattern,\r
+ IN EFI_REGEX_SYNTAX_TYPE *SyntaxType, OPTIONAL\r
+ OUT BOOLEAN *Result,\r
+ OUT EFI_REGEX_CAPTURE **Captures, OPTIONAL\r
+ OUT UINTN *CapturesCount\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT32 Index;\r
+ BOOLEAN Supported;\r
+\r
+ if (This == NULL || String == NULL || Pattern == NULL || Result == NULL || CapturesCount == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Figure out which syntax to use\r
+ //\r
+ if (SyntaxType == NULL) {\r
+ SyntaxType = mSupportedSyntaxes[0];\r
+ } else {\r
+ Supported = FALSE;\r
+ for (Index = 0; Index < ARRAY_SIZE (mSupportedSyntaxes); ++Index) {\r
+ if (CompareGuid (SyntaxType, mSupportedSyntaxes[Index])) {\r
+ Supported = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ if (!Supported) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ }\r
+\r
+ Status = OnigurumaMatch (String, Pattern, SyntaxType, Result, Captures, CapturesCount);\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Entry point for RegularExpressionDxe.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegularExpressionDxeEntry (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &ImageHandle,\r
+ &gEfiRegularExpressionProtocolGuid,\r
+ &mProtocolInstance,\r
+ NULL\r
+ );\r
+\r
+ return Status;\r
+}\r
--- /dev/null
+/**\r
+ @file\r
+\r
+ EFI_REGULAR_EXPRESSION_PROTOCOL Header File.\r
+\r
+ Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+ \r
+ This program and the accompanying materials are licensed and made available\r
+ under the terms and conditions of the BSD License that accompanies this\r
+ distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+\r
+#include "Oniguruma/oniguruma.h"\r
+\r
+#include <Uefi.h>\r
+#include <Protocol/RegularExpressionProtocol.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+\r
+#define ARRAY_SIZE(Array) (sizeof(Array) / sizeof(*Array))\r
+\r
+/**\r
+ Checks if the input string matches to the regular expression pattern.\r
+\r
+ This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL instance.\r
+ Type EFI_REGULAR_EXPRESSION_PROTOCOL is defined in Section\r
+ XYZ.\r
+\r
+ String A pointer to a NULL terminated string to match against the\r
+ regular expression string specified by Pattern.\r
+\r
+ Pattern A pointer to a NULL terminated string that represents the\r
+ regular expression.\r
+\r
+ SyntaxType A pointer to the EFI_REGEX_SYNTAX_TYPE that identifies the\r
+ regular expression syntax type to use. May be NULL in which\r
+ case the function will use its default regular expression\r
+ syntax type.\r
+\r
+ Result On return, points to TRUE if String fully matches against\r
+ the regular expression Pattern using the regular expression\r
+ SyntaxType. Otherwise, points to FALSE.\r
+\r
+ Captures A Pointer to an array of EFI_REGEX_CAPTURE objects to receive\r
+ the captured groups in the event of a match. The full\r
+ sub-string match is put in Captures[0], and the results of N\r
+ capturing groups are put in Captures[1:N]. If Captures is\r
+ NULL, then this function doesn't allocate the memory for the\r
+ array and does not build up the elements. It only returns the\r
+ number of matching patterns in CapturesCount. If Captures is\r
+ not NULL, this function returns a pointer to an array and\r
+ builds up the elements in the array. CapturesCount is also\r
+ updated to the number of matching patterns found. It is the\r
+ caller's responsibility to free the memory pool in Captures\r
+ and in each CapturePtr in the array elements.\r
+\r
+ CapturesCount On output, CapturesCount is the number of matching patterns\r
+ found in String. Zero means no matching patterns were found\r
+ in the string.\r
+\r
+ @retval EFI_SUCCESS The regular expression string matching\r
+ completed successfully.\r
+ @retval EFI_UNSUPPORTED The regular expression syntax specified by\r
+ SyntaxType is not supported by this driver.\r
+ @retval EFI_DEVICE_ERROR The regular expression string matching\r
+ failed due to a hardware or firmware error.\r
+ @retval EFI_INVALID_PARAMETER String, Pattern, Result, or CapturesCountis\r
+ NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegularExpressionMatch (\r
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *This,\r
+ IN CHAR16 *String,\r
+ IN CHAR16 *Pattern,\r
+ IN EFI_REGEX_SYNTAX_TYPE *SyntaxType, OPTIONAL\r
+ OUT BOOLEAN *Result,\r
+ OUT EFI_REGEX_CAPTURE **Captures, OPTIONAL\r
+ OUT UINTN *CapturesCount\r
+ );\r
+\r
+/**\r
+ Returns information about the regular expression syntax types supported\r
+ by the implementation.\r
+\r
+ This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL\r
+ instance.\r
+\r
+ RegExSyntaxTypeListSize On input, the size in bytes of RegExSyntaxTypeList.\r
+ On output with a return code of EFI_SUCCESS, the\r
+ size in bytes of the data returned in\r
+ RegExSyntaxTypeList. On output with a return code\r
+ of EFI_BUFFER_TOO_SMALL, the size of\r
+ RegExSyntaxTypeList required to obtain the list.\r
+\r
+ RegExSyntaxTypeList A caller-allocated memory buffer filled by the\r
+ driver with one EFI_REGEX_SYNTAX_TYPE element\r
+ for each supported Regular expression syntax\r
+ type. The list must not change across multiple\r
+ calls to the same driver. The first syntax\r
+ type in the list is the default type for the\r
+ driver.\r
+\r
+ @retval EFI_SUCCESS The regular expression syntax types list\r
+ was returned successfully.\r
+ @retval EFI_UNSUPPORTED The service is not supported by this driver.\r
+ @retval EFI_DEVICE_ERROR The list of syntax types could not be\r
+ retrieved due to a hardware or firmware error.\r
+ @retval EFI_BUFFER_TOO_SMALL The buffer RegExSyntaxTypeList is too small\r
+ to hold the result.\r
+ @retval EFI_INVALID_PARAMETER RegExSyntaxTypeListSize is NULL\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegularExpressionGetInfo (\r
+ IN EFI_REGULAR_EXPRESSION_PROTOCOL *This,\r
+ IN OUT UINTN *RegExSyntaxTypeListSize,\r
+ OUT EFI_REGEX_SYNTAX_TYPE *RegExSyntaxTypeList\r
+ );\r
+\r
+\r
--- /dev/null
+##\r
+# @file\r
+#\r
+# EFI_REGULAR_EXPRESSION_PROTOCOL Implementation\r
+#\r
+# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License that accompanies this\r
+# distribution. The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
+# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010018\r
+ BASE_NAME = RegularExpressionDxe\r
+ FILE_GUID = 3E197E9C-D8DC-42D3-89CE-B04FA9833756\r
+ MODULE_TYPE = UEFI_DRIVER\r
+ VERSION_STRING = 1.0\r
+ ENTRY_POINT = RegularExpressionDxeEntry\r
+\r
+[Sources]\r
+ RegularExpressionDxe.c\r
+ RegularExpressionDxe.h\r
+ Oniguruma/OnigurumaUefiPort.h\r
+ Oniguruma/OnigurumaUefiPort.c\r
+ Oniguruma/OnigurumaIntrinsics.c | MSFT\r
+\r
+# Upstream Oniguruma code\r
+ Oniguruma/oniguruma.h\r
+ Oniguruma/regcomp.c\r
+ Oniguruma/regenc.c\r
+ Oniguruma/regenc.h\r
+ Oniguruma/regerror.c\r
+ Oniguruma/regexec.c\r
+ Oniguruma/oniggnu.h\r
+ Oniguruma/reggnu.c\r
+ Oniguruma/regint.h\r
+ Oniguruma/regparse.c\r
+ Oniguruma/regparse.h\r
+ Oniguruma/regposerr.c\r
+ Oniguruma/onigposix.h\r
+ Oniguruma/regposix.c\r
+ Oniguruma/regsyntax.c\r
+ Oniguruma/regtrav.c\r
+ Oniguruma/regversion.c\r
+ Oniguruma/st.c\r
+ Oniguruma/st.h\r
+\r
+# Supported Character Encodings\r
+ Oniguruma/enc/ascii.c\r
+ Oniguruma/enc/unicode.c\r
+ Oniguruma/enc/utf16_le.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+ UefiBootServicesTableLib\r
+ UefiDriverEntryPoint\r
+ MemoryAllocationLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+\r
+[Guids]\r
+ gEfiRegexSyntaxTypePosixExtendedGuid\r
+ gEfiRegexSyntaxTypePerlGuid\r
+\r
+[Protocols]\r
+ gEfiRegularExpressionProtocolGuid\r
+\r
+[BuildOptions]\r
+ # Override MSFT build option to remove /Oi and /GL\r
+ MSFT:DEBUG_*_IA32_CC_FLAGS == /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm \r
+ MSFT:RELEASE_*_IA32_CC_FLAGS == /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /FIAutoGen.h /EHs-c- /GR- /GF \r
+ MSFT:DEBUG_*_X64_CC_FLAGS == /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2s /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /X \r
+ MSFT:RELEASE_*_X64_CC_FLAGS == /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2s /FIAutoGen.h /EHs-c- /GR- /GF /Gy /X \r
+ MSFT:DEBUG_*_IPF_CC_FLAGS == /nologo /c /WX /GS- /W4 /EHs-c- /GR- /Gy /Os /FIAutoGen.h /QIPF_fr32 /Zi /X \r
+ MSFT:RELEASE_*_IPF_CC_FLAGS == /nologo /c /WX /GS- /W4 /EHs-c- /GR- /Gy /Os /FIAutoGen.h /QIPF_fr32 /X \r
+ INTEL:*_*_*_CC_FLAGS = /Oi-\r
+ GCC:*_*_*_CC_FLAGS = -fno-builtin\r
+\r
+ # Oniguruma: potentially uninitialized local variable used\r
+ MSFT:*_*_*_CC_FLAGS = /wd4701\r
+\r
+ # Oniguruma: intrinsic function not declared\r
+ MSFT:*_*_*_CC_FLAGS = /wd4164\r
+\r
+ # Oniguruma: old style declaration in st.c\r
+ MSFT:*_*_*_CC_FLAGS = /wd4131\r
+\r
+ # Oniguruma: 'type cast' : truncation from 'OnigUChar *' to 'unsigned int' \r
+ MSFT:*_*_*_CC_FLAGS = /wd4305 /wd4306\r
+\r