1# -*- coding: utf-8 -*-
2
3"""Using Onigmo (Oniguruma-mod) regular expression library.
4
5This is a low level wrapper for Onigmo regular expression DLL/shared object.
6(This module does not support static link library.)
7This provides almost same API as the original C API, so the API is not
8object oriented.
9
10Onigmo DLL (onigmo.dll, libonigmo.so, etc.) must be placed in the
11default search path. The default search path depends on the system.
12"""
13
14import ctypes
15import os
16import sys
17
18#__all__ = ["onig_new", "onig_free",
19#           "onig_search", "onig_match",
20#           "onig_region_new", "onig_region_free",
21#           "onig_version", "onig_copyright"]
22
23#
24# Onigmo API version
25# (Must be synchronized with LTVERSION in configure.ac.)
26#
27_onig_api_version = 6
28
29#
30# Type Definitions
31#
32
33OnigCodePoint = ctypes.c_uint
34
35class OnigRegexType(ctypes.Structure):
36    _fields_ = [
37    ]
38regex_t = OnigRegexType
39OnigRegex = ctypes.POINTER(OnigRegexType)
40
41try:
42    # Python 2.7
43    _c_ssize_t = ctypes.c_ssize_t
44except AttributeError:
45    # Python 2.6
46    if ctypes.sizeof(ctypes.c_int) == ctypes.sizeof(ctypes.c_void_p):
47        _c_ssize_t = ctypes.c_int
48    elif ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):
49        _c_ssize_t = ctypes.c_long
50    elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):
51        _c_ssize_t = ctypes.c_longlong
52
53class OnigRegion(ctypes.Structure):
54    _fields_ = [
55        ("allocated",   ctypes.c_int),
56        ("num_regs",    ctypes.c_int),
57        ("beg",         ctypes.POINTER(_c_ssize_t)),
58        ("end",         ctypes.POINTER(_c_ssize_t)),
59        ("history_root",ctypes.c_void_p),
60    ]
61re_registers = OnigRegion
62
63OnigOptionType = ctypes.c_int
64
65class OnigEncodingType(ctypes.Structure):
66    _fields_ = [
67        ("mbc_enc_len",     ctypes.c_void_p),
68        ("name",            ctypes.c_char_p),
69        ("max_enc_len",     ctypes.c_int),
70        ("min_enc_len",     ctypes.c_int),
71        ("is_mbc_newline",  ctypes.c_void_p),
72        ("mbc_to_code",     ctypes.c_void_p),
73        ("code_to_mbclen",  ctypes.c_void_p),
74        ("code_to_mbc",     ctypes.c_void_p),
75        ("mbc_case_fold",   ctypes.c_void_p),
76        ("apply_all_case_fold",     ctypes.c_void_p),
77        ("get_case_fold_codes_by_str",  ctypes.c_void_p),
78        ("property_name_to_ctype",  ctypes.c_void_p),
79        ("is_code_ctype",           ctypes.c_void_p),
80        ("get_ctype_code_range",    ctypes.c_void_p),
81        ("left_adjust_char_head",   ctypes.c_void_p),
82        ("is_allowed_reverse_match",ctypes.c_void_p),
83        ("case_map",                ctypes.c_void_p),
84        ("ruby_encoding_index",     ctypes.c_int),
85        ("flags",                   ctypes.c_int),
86    ]
87OnigEncoding = ctypes.POINTER(OnigEncodingType)
88
89class OnigMetaCharTableType(ctypes.Structure):
90    _fields_ = [
91        ("esc",             OnigCodePoint),
92        ("anychar",         OnigCodePoint),
93        ("anytime",         OnigCodePoint),
94        ("zero_or_one_time",OnigCodePoint),
95        ("one_or_one_time", OnigCodePoint),
96        ("anychar_anytime", OnigCodePoint),
97    ]
98
99class OnigSyntaxType(ctypes.Structure):
100    _fields_ = [
101        ("op",              ctypes.c_uint),
102        ("op2",             ctypes.c_uint),
103        ("behavior",        ctypes.c_uint),
104        ("options",         OnigOptionType),
105        ("meta_char_table", OnigMetaCharTableType),
106    ]
107
108class OnigErrorInfo(ctypes.Structure):
109    _fields_ = [
110        ("enc",     OnigEncoding),
111        ("par",     ctypes.c_char_p),
112        ("par_end", ctypes.c_char_p),
113    ]
114
115
116# load the DLL or the shared library
117
118if os.name in ("nt", "ce"):
119    # Win32
120    _libname = "onigmo.dll"
121    try:
122        libonig = ctypes.cdll.LoadLibrary(_libname)
123    except OSError:
124        # Sometimes MinGW version has a prefix "lib".
125        _libname = "libonigmo.dll"
126        try:
127            libonig = ctypes.cdll.LoadLibrary(_libname)
128        except OSError:
129            # Sometimes MinGW version has the API version.
130            _libname = "libonigmo-%d.dll" % _onig_api_version
131            libonig = ctypes.cdll.LoadLibrary(_libname)
132elif sys.platform == "cygwin":
133    # Cygwin
134    _libname = "cygonigmo-%d.dll" % _onig_api_version
135    libonig = ctypes.cdll.LoadLibrary(_libname)
136elif sys.platform == "msys":
137    # MSYS/MSYS2
138    _libname = "msys-onigmo-%d.dll" % _onig_api_version
139    libonig = ctypes.cdll.LoadLibrary(_libname)
140elif sys.platform == "darwin":
141    # Mac
142    _libname = "libonigmo.dylib"
143    libonig = ctypes.cdll.LoadLibrary(_libname)
144else:
145    # Unix
146    _libname = "libonigmo.so"
147    libonig = ctypes.cdll.LoadLibrary(_libname)
148
149#
150# Encodings
151#
152def _load_encoding(enc):
153    return ctypes.pointer(OnigEncodingType.in_dll(libonig, enc))
154
155ONIG_ENCODING_ASCII         = _load_encoding("OnigEncodingASCII")
156ONIG_ENCODING_ISO_8859_1    = _load_encoding("OnigEncodingISO_8859_1")
157ONIG_ENCODING_ISO_8859_2    = _load_encoding("OnigEncodingISO_8859_2")
158ONIG_ENCODING_ISO_8859_3    = _load_encoding("OnigEncodingISO_8859_3")
159ONIG_ENCODING_ISO_8859_4    = _load_encoding("OnigEncodingISO_8859_4")
160ONIG_ENCODING_ISO_8859_5    = _load_encoding("OnigEncodingISO_8859_5")
161ONIG_ENCODING_ISO_8859_6    = _load_encoding("OnigEncodingISO_8859_6")
162ONIG_ENCODING_ISO_8859_7    = _load_encoding("OnigEncodingISO_8859_7")
163ONIG_ENCODING_ISO_8859_8    = _load_encoding("OnigEncodingISO_8859_8")
164ONIG_ENCODING_ISO_8859_9    = _load_encoding("OnigEncodingISO_8859_9")
165ONIG_ENCODING_ISO_8859_10   = _load_encoding("OnigEncodingISO_8859_10")
166ONIG_ENCODING_ISO_8859_11   = _load_encoding("OnigEncodingISO_8859_11")
167ONIG_ENCODING_ISO_8859_13   = _load_encoding("OnigEncodingISO_8859_13")
168ONIG_ENCODING_ISO_8859_14   = _load_encoding("OnigEncodingISO_8859_14")
169ONIG_ENCODING_ISO_8859_15   = _load_encoding("OnigEncodingISO_8859_15")
170ONIG_ENCODING_ISO_8859_16   = _load_encoding("OnigEncodingISO_8859_16")
171ONIG_ENCODING_UTF_8         = _load_encoding("OnigEncodingUTF_8")
172ONIG_ENCODING_UTF_16LE      = _load_encoding("OnigEncodingUTF_16LE")
173ONIG_ENCODING_UTF_16BE      = _load_encoding("OnigEncodingUTF_16BE")
174ONIG_ENCODING_UTF_32LE      = _load_encoding("OnigEncodingUTF_32LE")
175ONIG_ENCODING_UTF_32BE      = _load_encoding("OnigEncodingUTF_32BE")
176ONIG_ENCODING_UTF8          = ONIG_ENCODING_UTF_8
177ONIG_ENCODING_UTF16_LE      = ONIG_ENCODING_UTF_16LE
178ONIG_ENCODING_UTF16_BE      = ONIG_ENCODING_UTF_16BE
179ONIG_ENCODING_UTF32_LE      = ONIG_ENCODING_UTF_32LE
180ONIG_ENCODING_UTF32_BE      = ONIG_ENCODING_UTF_32BE
181ONIG_ENCODING_EUC_JP        = _load_encoding("OnigEncodingEUC_JP")
182ONIG_ENCODING_EUC_TW        = _load_encoding("OnigEncodingEUC_TW")
183ONIG_ENCODING_EUC_KR        = _load_encoding("OnigEncodingEUC_KR")
184ONIG_ENCODING_EUC_CN        = _load_encoding("OnigEncodingEUC_CN")
185ONIG_ENCODING_SHIFT_JIS     = _load_encoding("OnigEncodingShift_JIS")
186ONIG_ENCODING_WINDOWS_31J   = _load_encoding("OnigEncodingWindows_31J")
187ONIG_ENCODING_SJIS          = ONIG_ENCODING_SHIFT_JIS
188ONIG_ENCODING_CP932         = ONIG_ENCODING_WINDOWS_31J
189#ONIG_ENCODING_KOI8         = _load_encoding("OnigEncodingKOI8")
190ONIG_ENCODING_KOI8_R        = _load_encoding("OnigEncodingKOI8_R")
191ONIG_ENCODING_KOI8_U        = _load_encoding("OnigEncodingKOI8_U")
192ONIG_ENCODING_WINDOWS_1250  = _load_encoding("OnigEncodingWindows_1250")
193ONIG_ENCODING_WINDOWS_1251  = _load_encoding("OnigEncodingWindows_1251")
194ONIG_ENCODING_WINDOWS_1252  = _load_encoding("OnigEncodingWindows_1252")
195ONIG_ENCODING_WINDOWS_1253  = _load_encoding("OnigEncodingWindows_1253")
196ONIG_ENCODING_WINDOWS_1254  = _load_encoding("OnigEncodingWindows_1254")
197ONIG_ENCODING_WINDOWS_1257  = _load_encoding("OnigEncodingWindows_1257")
198ONIG_ENCODING_CP1250        = ONIG_ENCODING_WINDOWS_1250
199ONIG_ENCODING_CP1251        = ONIG_ENCODING_WINDOWS_1251
200ONIG_ENCODING_CP1252        = ONIG_ENCODING_WINDOWS_1252
201ONIG_ENCODING_CP1253        = ONIG_ENCODING_WINDOWS_1253
202ONIG_ENCODING_CP1254        = ONIG_ENCODING_WINDOWS_1254
203ONIG_ENCODING_CP1257        = ONIG_ENCODING_WINDOWS_1257
204ONIG_ENCODING_BIG5          = _load_encoding("OnigEncodingBIG5")
205ONIG_ENCODING_GB18030       = _load_encoding("OnigEncodingGB18030")
206
207#ONIG_ENCODING_UNDEF         = None
208
209
210#
211# Syntaxes
212#
213def _load_syntax(syn):
214    return ctypes.pointer(OnigSyntaxType.in_dll(libonig, syn))
215
216ONIG_SYNTAX_ASIS            = _load_syntax("OnigSyntaxASIS")
217ONIG_SYNTAX_POSIX_BASIC     = _load_syntax("OnigSyntaxPosixBasic")
218ONIG_SYNTAX_POSIX_EXTENDED  = _load_syntax("OnigSyntaxPosixExtended")
219ONIG_SYNTAX_EMACS           = _load_syntax("OnigSyntaxEmacs")
220ONIG_SYNTAX_GREP            = _load_syntax("OnigSyntaxGrep")
221ONIG_SYNTAX_GNU_REGEX       = _load_syntax("OnigSyntaxGnuRegex")
222ONIG_SYNTAX_JAVA            = _load_syntax("OnigSyntaxJava")
223ONIG_SYNTAX_PERL            = _load_syntax("OnigSyntaxPerl")
224ONIG_SYNTAX_PERL58          = _load_syntax("OnigSyntaxPerl58")
225ONIG_SYNTAX_PERL58_NG       = _load_syntax("OnigSyntaxPerl58_NG")
226ONIG_SYNTAX_RUBY            = _load_syntax("OnigSyntaxRuby")
227ONIG_SYNTAX_PYTHON          = _load_syntax("OnigSyntaxPython")
228
229ONIG_SYNTAX_DEFAULT         = ctypes.POINTER(OnigSyntaxType).in_dll(
230                                    libonig, "OnigDefaultSyntax")
231
232
233#
234# Constants
235#
236
237ONIG_MAX_ERROR_MESSAGE_LEN = 90
238
239# options
240ONIG_OPTION_NONE                = 0
241ONIG_OPTION_IGNORECASE          = 1
242ONIG_OPTION_EXTEND              = (ONIG_OPTION_IGNORECASE         << 1)
243ONIG_OPTION_MULTILINE           = (ONIG_OPTION_EXTEND             << 1)
244ONIG_OPTION_DOTALL              =  ONIG_OPTION_MULTILINE
245ONIG_OPTION_SINGLELINE          = (ONIG_OPTION_MULTILINE          << 1)
246ONIG_OPTION_FIND_LONGEST        = (ONIG_OPTION_SINGLELINE         << 1)
247ONIG_OPTION_FIND_NOT_EMPTY      = (ONIG_OPTION_FIND_LONGEST       << 1)
248ONIG_OPTION_NEGATE_SINGLELINE   = (ONIG_OPTION_FIND_NOT_EMPTY     << 1)
249ONIG_OPTION_DONT_CAPTURE_GROUP  = (ONIG_OPTION_NEGATE_SINGLELINE  << 1)
250ONIG_OPTION_CAPTURE_GROUP       = (ONIG_OPTION_DONT_CAPTURE_GROUP << 1)
251# options (search time)
252ONIG_OPTION_NOTBOL              = (ONIG_OPTION_CAPTURE_GROUP << 1)
253ONIG_OPTION_NOTEOL              = (ONIG_OPTION_NOTBOL << 1)
254ONIG_OPTION_NOTBOS              = (ONIG_OPTION_NOTEOL << 1)
255ONIG_OPTION_NOTEOS              = (ONIG_OPTION_NOTBOS << 1)
256# options (ctype range)
257ONIG_OPTION_ASCII_RANGE         = (ONIG_OPTION_NOTEOS << 1)
258ONIG_OPTION_POSIX_BRACKET_ALL_RANGE = (ONIG_OPTION_ASCII_RANGE << 1)
259ONIG_OPTION_WORD_BOUND_ALL_RANGE    = (ONIG_OPTION_POSIX_BRACKET_ALL_RANGE << 1)
260# options (newline)
261ONIG_OPTION_NEWLINE_CRLF        = (ONIG_OPTION_WORD_BOUND_ALL_RANGE << 1)
262
263ONIG_OPTION_DEFAULT             = ONIG_OPTION_NONE
264
265
266# syntax (operators)
267ONIG_SYN_OP_VARIABLE_META_CHARACTERS    = (1<<0)
268ONIG_SYN_OP_DOT_ANYCHAR                 = (1<<1)
269ONIG_SYN_OP_ASTERISK_ZERO_INF           = (1<<2)
270ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF       = (1<<3)
271ONIG_SYN_OP_PLUS_ONE_INF                = (1<<4)
272ONIG_SYN_OP_ESC_PLUS_ONE_INF            = (1<<5)
273ONIG_SYN_OP_QMARK_ZERO_ONE              = (1<<6)
274ONIG_SYN_OP_ESC_QMARK_ZERO_ONE          = (1<<7)
275ONIG_SYN_OP_BRACE_INTERVAL              = (1<<8)
276ONIG_SYN_OP_ESC_BRACE_INTERVAL          = (1<<9)
277ONIG_SYN_OP_VBAR_ALT                    = (1<<10)
278ONIG_SYN_OP_ESC_VBAR_ALT                = (1<<11)
279ONIG_SYN_OP_LPAREN_SUBEXP               = (1<<12)
280ONIG_SYN_OP_ESC_LPAREN_SUBEXP           = (1<<13)
281ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR           = (1<<14)
282ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR  = (1<<15)
283ONIG_SYN_OP_DECIMAL_BACKREF             = (1<<16)
284ONIG_SYN_OP_BRACKET_CC                  = (1<<17)
285ONIG_SYN_OP_ESC_W_WORD                  = (1<<18)
286ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END     = (1<<19)
287ONIG_SYN_OP_ESC_B_WORD_BOUND            = (1<<20)
288ONIG_SYN_OP_ESC_S_WHITE_SPACE           = (1<<21)
289ONIG_SYN_OP_ESC_D_DIGIT                 = (1<<22)
290ONIG_SYN_OP_LINE_ANCHOR                 = (1<<23)
291ONIG_SYN_OP_POSIX_BRACKET               = (1<<24)
292ONIG_SYN_OP_QMARK_NON_GREEDY            = (1<<25)
293ONIG_SYN_OP_ESC_CONTROL_CHARS           = (1<<26)
294ONIG_SYN_OP_ESC_C_CONTROL               = (1<<27)
295ONIG_SYN_OP_ESC_OCTAL3                  = (1<<28)
296ONIG_SYN_OP_ESC_X_HEX2                  = (1<<29)
297ONIG_SYN_OP_ESC_X_BRACE_HEX8            = (1<<30)
298ONIG_SYN_OP_ESC_O_BRACE_OCTAL           = (1<<31)
299
300ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE        = (1<<0)
301ONIG_SYN_OP2_QMARK_GROUP_EFFECT         = (1<<1)
302ONIG_SYN_OP2_OPTION_PERL                = (1<<2)
303ONIG_SYN_OP2_OPTION_RUBY                = (1<<3)
304ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT     = (1<<4)
305ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL   = (1<<5)
306ONIG_SYN_OP2_CCLASS_SET_OP              = (1<<6)
307ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP       = (1<<7)
308ONIG_SYN_OP2_ESC_K_NAMED_BACKREF        = (1<<8)
309ONIG_SYN_OP2_ESC_G_SUBEXP_CALL          = (1<<9)
310ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY     = (1<<10)
311ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL  = (1<<11)
312ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META     = (1<<12)
313ONIG_SYN_OP2_ESC_V_VTAB                 = (1<<13)
314ONIG_SYN_OP2_ESC_U_HEX4                 = (1<<14)
315ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR         = (1<<15)
316ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  = (1<<16)
317ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT = (1<<17)
318#ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS   = (1<<18)
319ONIG_SYN_OP2_ESC_H_XDIGIT               = (1<<19)
320ONIG_SYN_OP2_INEFFECTIVE_ESCAPE         = (1<<20)
321ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK    = (1<<21)
322ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER = (1<<22)
323ONIG_SYN_OP2_ESC_V_VERTICAL_WHITESPACE   = (1<<23)
324ONIG_SYN_OP2_ESC_H_HORIZONTAL_WHITESPACE = (1<<24)
325ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP          = (1<<25)
326ONIG_SYN_OP2_ESC_G_BRACE_BACKREF         = (1<<26)
327ONIG_SYN_OP2_QMARK_SUBEXP_CALL           = (1<<27)
328ONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET     = (1<<28)
329ONIG_SYN_OP2_QMARK_LPAREN_CONDITION      = (1<<29)
330ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP = (1<<30)
331ONIG_SYN_OP2_OPTION_JAVA                 = (1<<31)
332
333# syntax (behavior)
334ONIG_SYN_CONTEXT_INDEP_ANCHORS           = (1<<31)
335ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS        = (1<<0)
336ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS      = (1<<1)
337ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP    = (1<<2)
338ONIG_SYN_ALLOW_INVALID_INTERVAL          = (1<<3)
339ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV       = (1<<4)
340ONIG_SYN_STRICT_CHECK_BACKREF            = (1<<5)
341ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND   = (1<<6)
342ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP        = (1<<7)
343ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME = (1<<8)
344ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY   = (1<<9)
345ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL = (1<<10)
346ONIG_SYN_USE_LEFT_MOST_NAMED_GROUP       = (1<<11)
347
348# (behavior) in char class [...]
349ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC     = (1<<20)
350ONIG_SYN_BACKSLASH_ESCAPE_IN_CC         = (1<<21)
351ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC        = (1<<22)
352ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC    = (1<<23)
353# syntax (behavior) warning
354ONIG_SYN_WARN_CC_OP_NOT_ESCAPED         = (1<<24)
355ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT   = (1<<25)
356ONIG_SYN_WARN_CC_DUP                    = (1<<26)
357
358# meta character specifiers (onig_set_meta_char())
359ONIG_META_CHAR_ESCAPE               = 0
360ONIG_META_CHAR_ANYCHAR              = 1
361ONIG_META_CHAR_ANYTIME              = 2
362ONIG_META_CHAR_ZERO_OR_ONE_TIME     = 3
363ONIG_META_CHAR_ONE_OR_MORE_TIME     = 4
364ONIG_META_CHAR_ANYCHAR_ANYTIME      = 5
365
366ONIG_INEFFECTIVE_META_CHAR          = 0
367
368
369# error codes
370def ONIG_IS_PATTERN_ERROR(ecode):
371    return ((ecode) <= -100 and (ecode) > -1000)
372# normal return
373ONIG_NORMAL                                             =     0
374ONIG_MISMATCH                                           =    -1
375ONIG_NO_SUPPORT_CONFIG                                  =    -2
376# internal error
377ONIGERR_MEMORY                                          =    -5
378ONIGERR_TYPE_BUG                                        =    -6
379ONIGERR_PARSER_BUG                                      =   -11
380ONIGERR_STACK_BUG                                       =   -12
381ONIGERR_UNDEFINED_BYTECODE                              =   -13
382ONIGERR_UNEXPECTED_BYTECODE                             =   -14
383ONIGERR_MATCH_STACK_LIMIT_OVER                          =   -15
384ONIGERR_PARSE_DEPTH_LIMIT_OVER                          =   -16
385ONIGERR_DEFAULT_ENCODING_IS_NOT_SET                     =   -21
386ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR    =   -22
387# general error
388ONIGERR_INVALID_ARGUMENT                                =   -30
389# syntax error
390ONIGERR_END_PATTERN_AT_LEFT_BRACE                       =  -100
391ONIGERR_END_PATTERN_AT_LEFT_BRACKET                     =  -101
392ONIGERR_EMPTY_CHAR_CLASS                                =  -102
393ONIGERR_PREMATURE_END_OF_CHAR_CLASS                     =  -103
394ONIGERR_END_PATTERN_AT_ESCAPE                           =  -104
395ONIGERR_END_PATTERN_AT_META                             =  -105
396ONIGERR_END_PATTERN_AT_CONTROL                          =  -106
397ONIGERR_META_CODE_SYNTAX                                =  -108
398ONIGERR_CONTROL_CODE_SYNTAX                             =  -109
399ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE                =  -110
400ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE              =  -111
401ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS         =  -112
402ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED         =  -113
403ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID               =  -114
404ONIGERR_NESTED_REPEAT_OPERATOR                          =  -115
405ONIGERR_UNMATCHED_CLOSE_PARENTHESIS                     =  -116
406ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS          =  -117
407ONIGERR_END_PATTERN_IN_GROUP                            =  -118
408ONIGERR_UNDEFINED_GROUP_OPTION                          =  -119
409ONIGERR_INVALID_POSIX_BRACKET_TYPE                      =  -121
410ONIGERR_INVALID_LOOK_BEHIND_PATTERN                     =  -122
411ONIGERR_INVALID_REPEAT_RANGE_PATTERN                    =  -123
412ONIGERR_INVALID_CONDITION_PATTERN                       =  -124
413# values error (syntax error)
414ONIGERR_TOO_BIG_NUMBER                                  =  -200
415ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE                 =  -201
416ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE        =  -202
417ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS                       =  -203
418ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE             =  -204
419ONIGERR_TOO_MANY_MULTI_BYTE_RANGES                      =  -205
420ONIGERR_TOO_SHORT_MULTI_BYTE_STRING                     =  -206
421ONIGERR_TOO_BIG_BACKREF_NUMBER                          =  -207
422ONIGERR_INVALID_BACKREF                                 =  -208
423ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED            =  -209
424ONIGERR_TOO_MANY_CAPTURE_GROUPS                         =  -210
425ONIGERR_TOO_SHORT_DIGITS                                =  -211
426ONIGERR_TOO_LONG_WIDE_CHAR_VALUE                        =  -212
427ONIGERR_EMPTY_GROUP_NAME                                =  -214
428ONIGERR_INVALID_GROUP_NAME                              =  -215
429ONIGERR_INVALID_CHAR_IN_GROUP_NAME                      =  -216
430ONIGERR_UNDEFINED_NAME_REFERENCE                        =  -217
431ONIGERR_UNDEFINED_GROUP_REFERENCE                       =  -218
432ONIGERR_MULTIPLEX_DEFINED_NAME                          =  -219
433ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL                  =  -220
434ONIGERR_NEVER_ENDING_RECURSION                          =  -221
435ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY           =  -222
436ONIGERR_INVALID_CHAR_PROPERTY_NAME                      =  -223
437ONIGERR_INVALID_CODE_POINT_VALUE                        =  -400
438ONIGERR_INVALID_WIDE_CHAR_VALUE                         =  -400
439ONIGERR_TOO_BIG_WIDE_CHAR_VALUE                         =  -401
440ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION              =  -402
441ONIGERR_INVALID_COMBINATION_OF_OPTIONS                  =  -403
442
443# errors related to thread
444#ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT                    = -1001
445
446
447OnigWarnFunc = ctypes.CFUNCTYPE(None, ctypes.c_char_p)
448
449#
450# Onigmo APIs
451#
452
453# onig_init
454onig_init = libonig.onig_init
455
456# onig_error_code_to_str
457libonig.onig_error_code_to_str.argtypes = [ctypes.c_char_p, _c_ssize_t,
458        ctypes.POINTER(OnigErrorInfo)]
459def onig_error_code_to_str(err_buf, err_code, err_info=None):
460    return libonig.onig_error_code_to_str(err_buf, err_code, err_info)
461
462# onig_set_warn_func
463libonig.onig_set_warn_func.argtypes = [OnigWarnFunc]
464onig_set_warn_func = libonig.onig_set_warn_func
465
466# onig_set_verb_warn_func
467libonig.onig_set_verb_warn_func.argtypes = [OnigWarnFunc]
468onig_set_verb_warn_func = libonig.onig_set_verb_warn_func
469
470# onig_new
471libonig.onig_new.argtypes = [ctypes.POINTER(OnigRegex),
472        ctypes.c_void_p, ctypes.c_void_p,
473        OnigOptionType, OnigEncoding, ctypes.POINTER(OnigSyntaxType),
474        ctypes.POINTER(OnigErrorInfo)]
475onig_new = libonig.onig_new
476
477# onig_reg_init
478# onig_new_without_alloc
479# onig_new_deluxe
480
481# onig_free
482libonig.onig_free.argtypes = [OnigRegex]
483onig_free = libonig.onig_free
484
485# onig_free_body
486
487# onig_search
488libonig.onig_search.argtypes = [OnigRegex,
489        ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p,
490        ctypes.POINTER(OnigRegion), OnigOptionType]
491libonig.onig_search.restype = _c_ssize_t
492onig_search = libonig.onig_search
493
494# onig_search_gpos
495libonig.onig_search_gpos.argtypes = [OnigRegex,
496        ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p,
497        ctypes.c_void_p,
498        ctypes.POINTER(OnigRegion), OnigOptionType]
499libonig.onig_search_gpos.restype = _c_ssize_t
500onig_search_gpos = libonig.onig_search_gpos
501
502# onig_match
503libonig.onig_match.argtypes = [OnigRegex,
504        ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p,
505        ctypes.POINTER(OnigRegion), OnigOptionType]
506libonig.onig_match.restype = _c_ssize_t
507onig_match = libonig.onig_match
508
509# onig_region_new
510libonig.onig_region_new.argtypes = []
511libonig.onig_region_new.restype = ctypes.POINTER(OnigRegion)
512onig_region_new = libonig.onig_region_new
513
514# onig_region_init
515
516# onig_region_free
517libonig.onig_region_free.argtypes = [ctypes.POINTER(OnigRegion), ctypes.c_int]
518onig_region_free = libonig.onig_region_free
519
520# onig_region_copy
521# onig_region_clear
522# onig_region_resize
523# onig_region_set
524# onig_name_to_group_numbers
525# onig_name_to_backref_number
526# onig_foreach_name
527# onig_number_of_names
528# onig_number_of_captures
529# onig_number_of_capture_histories
530# onig_get_capture_tree
531# onig_capture_tree_traverse
532# onig_noname_group_capture_is_active
533# onig_get_encoding
534# onig_get_options
535# onig_get_case_fold_flag
536# onig_get_syntax
537
538# onig_set_default_syntax
539libonig.onig_set_default_syntax.argtypes = [ctypes.POINTER(OnigSyntaxType)]
540libonig.onig_set_default_syntax.restype = ctypes.c_int
541onig_set_default_syntax = libonig.onig_set_default_syntax
542
543# onig_copy_syntax
544libonig.onig_copy_syntax.argtypes = [ctypes.POINTER(OnigSyntaxType),
545        ctypes.POINTER(OnigSyntaxType)]
546onig_copy_syntax = libonig.onig_copy_syntax
547
548# onig_get_syntax_op
549libonig.onig_get_syntax_op.argtypes = [ctypes.POINTER(OnigSyntaxType)]
550libonig.onig_get_syntax_op.restype = ctypes.c_int
551onig_get_syntax_op = libonig.onig_get_syntax_op
552
553# onig_get_syntax_op2
554libonig.onig_get_syntax_op2.argtypes = [ctypes.POINTER(OnigSyntaxType)]
555libonig.onig_get_syntax_op2.restype = ctypes.c_int
556onig_get_syntax_op2 = libonig.onig_get_syntax_op2
557
558# onig_get_syntax_behavior
559libonig.onig_get_syntax_behavior.argtypes = [ctypes.POINTER(OnigSyntaxType)]
560libonig.onig_get_syntax_behavior.restype = ctypes.c_int
561onig_get_syntax_behavior = libonig.onig_get_syntax_behavior
562
563# onig_get_syntax_options
564libonig.onig_get_syntax_options.argtypes = [ctypes.POINTER(OnigSyntaxType)]
565libonig.onig_get_syntax_options.restype = ctypes.c_int
566onig_get_syntax_options = libonig.onig_get_syntax_options
567
568# onig_set_syntax_op
569libonig.onig_set_syntax_op.argtypes = [ctypes.POINTER(OnigSyntaxType),
570        ctypes.c_int]
571onig_set_syntax_op = libonig.onig_set_syntax_op
572
573# onig_set_syntax_op2
574libonig.onig_set_syntax_op2.argtypes = [ctypes.POINTER(OnigSyntaxType),
575        ctypes.c_int]
576onig_set_syntax_op2 = libonig.onig_set_syntax_op2
577
578# onig_set_syntax_behavior
579libonig.onig_set_syntax_behavior.argtypes = [ctypes.POINTER(OnigSyntaxType),
580        ctypes.c_int]
581onig_set_syntax_behavior = libonig.onig_set_syntax_behavior
582
583# onig_set_syntax_options
584libonig.onig_set_syntax_options.argtypes = [ctypes.POINTER(OnigSyntaxType),
585        ctypes.c_int]
586onig_set_syntax_options = libonig.onig_set_syntax_options
587
588# onig_set_meta_char
589# onig_copy_encoding
590# onig_get_default_case_fold_flag
591# onig_set_default_case_fold_flag
592
593# onig_get_match_stack_limit_size
594libonig.onig_get_match_stack_limit_size.argtypes = []
595libonig.onig_get_match_stack_limit_size.restype = ctypes.c_int
596onig_get_match_stack_limit_size = libonig.onig_get_match_stack_limit_size
597
598# onig_set_match_stack_limit_size
599libonig.onig_set_match_stack_limit_size.argtypes = [ctypes.c_int]
600libonig.onig_set_match_stack_limit_size.restype = ctypes.c_int
601onig_set_match_stack_limit_size = libonig.onig_set_match_stack_limit_size
602
603# onig_get_parse_depth_limit
604libonig.onig_get_parse_depth_limit.argtypes = []
605libonig.onig_get_parse_depth_limit.restype = ctypes.c_int
606onig_get_parse_depth_limit = libonig.onig_get_parse_depth_limit
607
608# onig_set_parse_depth_limit
609libonig.onig_set_parse_depth_limit.argtypes = [ctypes.c_int]
610libonig.onig_set_parse_depth_limit.restype = ctypes.c_int
611onig_set_parse_depth_limit = libonig.onig_set_parse_depth_limit
612
613# onig_end
614libonig.onig_end.argtypes = []
615onig_end = libonig.onig_end
616
617# onig_version
618libonig.onig_version.argtypes = []
619libonig.onig_version.restype = ctypes.c_char_p
620def onig_version():
621    return libonig.onig_version().decode()
622
623# onig_copyright
624libonig.onig_copyright.argtypes = []
625libonig.onig_copyright.restype = ctypes.c_char_p
626def onig_copyright():
627    return libonig.onig_copyright().decode()
628