]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Regular expression protocol
authorCecil Sheng <cecil.sheng@hpe.com>
Tue, 8 Sep 2015 07:10:03 +0000 (07:10 +0000)
committerydong10 <ydong10@Edk2>
Tue, 8 Sep 2015 07:10:03 +0000 (07:10 +0000)
Add driver to produce EFI_REGULAR_EXPRESSION_PROTOCOL.  Based on
Oniguruma v5.9.6 (BSD 2-clause license), which provides full Unicode
support, and POSIX ERE and Perl regex syntaxes.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Cecil Sheng <cecil.sheng@hpe.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18413 6f19259b-4bc3-4df7-8a09-765794883524

32 files changed:
MdeModulePkg/MdeModulePkg.dsc
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/AUTHORS [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/COPYING [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaIntrinsics.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/README [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/ascii.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/unicode.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/utf16_le.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniggnu.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/onigposix.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniguruma.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regcomp.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regerror.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regexec.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/reggnu.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regint.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposerr.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposix.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regsyntax.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regtrav.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regversion.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.h [new file with mode: 0644]
MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf [new file with mode: 0644]

index 3e04477318b94b9602c0a377ac0eb6119f46dbb2..8a76a4c7a3609b7bf8134c0a3c43f7495cd76cc9 100644 (file)
   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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/AUTHORS b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/AUTHORS
new file mode 100644 (file)
index 0000000..3b3287e
--- /dev/null
@@ -0,0 +1 @@
+sndgk393 AT ybb DOT ne DOT jp (K.Kosako)\r
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/COPYING b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/COPYING
new file mode 100644 (file)
index 0000000..f3d17ae
--- /dev/null
@@ -0,0 +1,28 @@
+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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaIntrinsics.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaIntrinsics.c
new file mode 100644 (file)
index 0000000..a60b647
--- /dev/null
@@ -0,0 +1,53 @@
+/** @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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.c
new file mode 100644 (file)
index 0000000..98822f3
--- /dev/null
@@ -0,0 +1,32 @@
+/** @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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/OnigurumaUefiPort.h
new file mode 100644 (file)
index 0000000..4ca7367
--- /dev/null
@@ -0,0 +1,66 @@
+/** @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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/README b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/README
new file mode 100644 (file)
index 0000000..18952ee
--- /dev/null
@@ -0,0 +1,189 @@
+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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/ascii.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/ascii.c
new file mode 100644 (file)
index 0000000..25afc98
--- /dev/null
@@ -0,0 +1,58 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/unicode.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/unicode.c
new file mode 100644 (file)
index 0000000..70a1a52
--- /dev/null
@@ -0,0 +1,11374 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/utf16_le.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/enc/utf16_le.c
new file mode 100644 (file)
index 0000000..b8685c4
--- /dev/null
@@ -0,0 +1,226 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniggnu.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniggnu.h
new file mode 100644 (file)
index 0000000..7ec8e2e
--- /dev/null
@@ -0,0 +1,85 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/onigposix.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/onigposix.h
new file mode 100644 (file)
index 0000000..7c2cad1
--- /dev/null
@@ -0,0 +1,169 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniguruma.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/oniguruma.h
new file mode 100644 (file)
index 0000000..034a2cc
--- /dev/null
@@ -0,0 +1,829 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regcomp.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regcomp.c
new file mode 100644 (file)
index 0000000..6dc6c28
--- /dev/null
@@ -0,0 +1,6291 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.c
new file mode 100644 (file)
index 0000000..9e0f001
--- /dev/null
@@ -0,0 +1,904 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regenc.h
new file mode 100644 (file)
index 0000000..1d39f9c
--- /dev/null
@@ -0,0 +1,189 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regerror.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regerror.c
new file mode 100644 (file)
index 0000000..7bbcd02
--- /dev/null
@@ -0,0 +1,394 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regexec.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regexec.c
new file mode 100644 (file)
index 0000000..4bfea0b
--- /dev/null
@@ -0,0 +1,3810 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/reggnu.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/reggnu.c
new file mode 100644 (file)
index 0000000..89cb4d6
--- /dev/null
@@ -0,0 +1,169 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regint.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regint.h
new file mode 100644 (file)
index 0000000..2db3b70
--- /dev/null
@@ -0,0 +1,820 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.c
new file mode 100644 (file)
index 0000000..d7e645b
--- /dev/null
@@ -0,0 +1,5556 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regparse.h
new file mode 100644 (file)
index 0000000..d5edd6e
--- /dev/null
@@ -0,0 +1,353 @@
+#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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposerr.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposerr.c
new file mode 100644 (file)
index 0000000..e5ff3f5
--- /dev/null
@@ -0,0 +1,102 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposix.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regposix.c
new file mode 100644 (file)
index 0000000..adc9b0a
--- /dev/null
@@ -0,0 +1,305 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regsyntax.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regsyntax.c
new file mode 100644 (file)
index 0000000..dc4d681
--- /dev/null
@@ -0,0 +1,315 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regtrav.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regtrav.c
new file mode 100644 (file)
index 0000000..fbc71d8
--- /dev/null
@@ -0,0 +1,76 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regversion.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/regversion.c
new file mode 100644 (file)
index 0000000..087c6ad
--- /dev/null
@@ -0,0 +1,56 @@
+/**********************************************************************\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.c b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.c
new file mode 100644 (file)
index 0000000..1527fcc
--- /dev/null
@@ -0,0 +1,579 @@
+/* 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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.h b/MdeModulePkg/Universal/RegularExpressionDxe/Oniguruma/st.h
new file mode 100644 (file)
index 0000000..a620002
--- /dev/null
@@ -0,0 +1,68 @@
+/* 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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.c
new file mode 100644 (file)
index 0000000..6c62957
--- /dev/null
@@ -0,0 +1,321 @@
+/**\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.h b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.h
new file mode 100644 (file)
index 0000000..4673471
--- /dev/null
@@ -0,0 +1,130 @@
+/**\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
diff --git a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf
new file mode 100644 (file)
index 0000000..7f1023e
--- /dev/null
@@ -0,0 +1,98 @@
+##\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