oniguruma/regexec.c
oniguruma/reggnu.c
oniguruma/regparse.c
+ oniguruma/regenc.c
oniguruma/regposerr.c
+ oniguruma/enc/ascii.c
+ oniguruma/enc/utf8.c
+ oniguruma/enc/euc_jp.c
+ oniguruma/enc/euc_tw.c
+ oniguruma/enc/euc_kr.c
+ oniguruma/enc/sjis.c
+ oniguruma/enc/iso8859_1.c
+ oniguruma/enc/iso8859_2.c
+ oniguruma/enc/iso8859_3.c
+ oniguruma/enc/iso8859_4.c
+ oniguruma/enc/iso8859_5.c
+ oniguruma/enc/iso8859_6.c
+ oniguruma/enc/iso8859_7.c
+ oniguruma/enc/iso8859_8.c
+ oniguruma/enc/iso8859_9.c
+ oniguruma/enc/iso8859_10.c
+ oniguruma/enc/iso8859_11.c
+ oniguruma/enc/iso8859_13.c
+ oniguruma/enc/iso8859_14.c
+ oniguruma/enc/iso8859_15.c
+ oniguruma/enc/iso8859_16.c
+ oniguruma/enc/koi8.c
+ oniguruma/enc/koi8_r.c
+ oniguruma/enc/big5.c
])
fi
])
MBSTRG(current_internal_encoding) = no_encoding;
#if HAVE_MBREGEX
{
- php_mb_reg_char_encoding mbctype;
+ OnigEncoding mbctype;
mbctype = php_mb_regex_name2mbctype(new_value);
- if (mbctype == REGCODE_UNDEF) {
- mbctype = REGCODE_EUCJP;
+ if (mbctype == ONIG_ENCODING_UNDEF) {
+ mbctype = ONIG_ENCODING_EUC_JP;
}
MBSTRG(current_mbctype) = MBSTRG(default_mbctype) = mbctype;
}
php_info_print_table_end();
php_info_print_table_start();
- php_info_print_table_colspan_header(2, "mbstring extension makes use of \"streamable kanji code filter and converter\", which is distributed under the GNU Lesser General Public License version 2.1.");
+ php_info_print_table_header(1, "mbstring extension makes use of \"streamable kanji code filter and converter\", which is distributed under the GNU Lesser General Public License version 2.1.");
php_info_print_table_end();
DISPLAY_INI_ENTRIES();
History
+2004/02/27: Version 2.2.2
+
+2004/02/27: [impl] fix the position of onig_stat_print().
+2004/02/27: [impl] define ONIG_RUBY_DEFINE_GLOBAL_FUNCTION() in regint.h
+ for ignored by RDoc.
+
+2004/02/26: Version 2.2.1
+
+2004/02/26: [bug] invalid definition at onig_error_code_to_str()
+ in the case of NOT HAVE_STDARG_PROTOTYPES.
+
+2004/02/25: Version 2.2.0
+
+2004/02/25: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].
+2004/02/24: [test] success in ruby 1.9.0 (2004-02-24) [i686-linux].
+2004/02/24: [bug] undefined IS_BLANK() and IS_GRAPH() was used in
+ onigenc_is_code_ctype() in the case of Ruby M17N.
+2004/02/24: [new] support ISO-8859-16. (ONIG_ENCODING_ISO_8859_16)
+2004/02/24: [bug] should not fold match for 0xdf in iso8859_6.c.
+2004/02/24: [new] support ISO-8859-14. (ONIG_ENCODING_ISO_8859_14)
+2004/02/23: [new] support ISO-8859-13. (ONIG_ENCODING_ISO_8859_13)
+2004/02/23: [new] support ISO-8859-10. (ONIG_ENCODING_ISO_8859_10)
+2004/02/20: [bug] fix iso_8859_4_mbc_is_case_ambig().
+2004/02/20: [new] support ISO-8859-9. (ONIG_ENCODING_ISO_8859_9)
+2004/02/19: [bug] correct ctype tables for ISO-8859-3, ISO-8859-4,
+ ISO-8859-6, ISO-8859-7, ISO-8859-8, KOI8_R.
+2004/02/18: [bug] wrong replaced name OnigSyntaxGnuOnigex.
+2004/02/17: [spec] check capture status for empty infinite loop.
+ [ruby-dev:20224] etc...
+ ex. /(?:\1a|())*/.match("a"),
+ /(?:()|()|()|(x)|()|())*\2b\5/.match("b")
+ add USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK.
+ add OP_NULL_CHECK_END_MEMST, OP_NULL_CHECK_END_MEMST_PUSH.
+ add stack type STK_NULL_CHECK_END.
+2004/02/13: [impl] add OnigEncodingEUC_CN to enc/euc_kr.c.
+2004/02/13: [bug] (thanks Simon Strandgaard)
+ parsing of nested repeat was invalid.
+ ex. /ab{2,3}*/ was /(?:a(?:b{2,3}))*/,
+ should be /a(?:b{2,3}*)/
+2004/02/12: [bug] (thanks Simon Strandgaard)
+ OP_REPEAT_INC_NG process in match_at() is wrong.
+ ex. bad match /a.{0,2}?a/ =~ "0aXXXa0"
+2004/02/12: [bug] (thanks Simon Strandgaard)
+ wrong fetch after (?x) option. ex. "(?x)\ta .\n+b"
+2004/02/12: [bug] (thanks Simon Strandgaard)
+ [\^] is not a empty char class.
+2004/02/09: [new] add onig_set_syntax_op(), onig_set_syntax_op2(),
+ onig_set_syntax_behavior(), onig_set_syntax_options().
+2004/02/06: [dist] add a new target 'site' to Makefile.in.
+2004/02/06: [dist] add index.html.
+2004/02/03: [bug] oniggnu.h was not installed by 'make install'.
+
+2004/02/02: Version 2.1.0
+
+2004/02/02: [test] success in ruby 1.9.0 (2004-02-02) [i686-linux].
+2004/02/02: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].
+2004/02/02: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].
+2004/02/02: [new] support ISO-8859-11. (ONIG_ENCODING_ISO_8859_11)
+2004/02/02: [new] support ISO-8859-5. (ONIG_ENCODING_ISO_8859_5)
+2004/02/02: [impl] should check single byte encoding or not in and_cclass()
+ and or_cclass().
+2004/01/30: [dist] add oniggnu.h.
+2004/01/30: [bug] ISO-8859-7 0xb7 (middle dot) is Punct type.
+2004/01/30: [new] support ISO-8859-8. (ONIG_ENCODING_ISO_8859_8)
+2004/01/29: [new] support ISO-8859-7. (ONIG_ENCODING_ISO_8859_7)
+2004/01/29: [new] support ISO-8859-6. (ONIG_ENCODING_ISO_8859_6)
+2004/01/28: [new] support KOI8-R. (ONIG_ENCODING_KOI8_R)
+2004/01/28: [new] support KOI8. (ONIG_ENCODING_KOI8)
+2004/01/27: [dist] rename enc/isotable.c to enc/mktable.c.
+2004/01/27: [new] support ISO-8859-4. (ONIG_ENCODING_ISO_8859_4)
+2004/01/26: [new] support ISO-8859-3. (ONIG_ENCODING_ISO_8859_3)
+2004/01/26: [bug] EncISO_8859_{1,15}_CtypeTable[256] was wrong.
+ (0x80 - 0xff is not ASCII)
+2004/01/23: [new] support ISO-8859-2. (ONIG_ENCODING_ISO_8859_2)
+2004/01/23: [dist] add enc/isotable.c.
+2004/01/22; [new] support EUC-TW. (ONIG_ENCODING_EUC_TW)
+2004/01/22: [bug] definition of GET_ALIGNMENT_PAD_SIZE() and
+ ALIGNMENT_RIGHT() was wrong.
+ type casting should be unsigned int, not int.
+2004/01/22: [impl] add defined(__x86_64) || defined(__x86_64__)
+ to unaligned word access condition. (AMD64 ?)
+2004/01/21: [dist] rename enc/eucjp.c to enc/euc_jp.c.
+2004/01/21; [new] support EUC-KR. (ONIG_ENCODING_EUC_KR)
+2004/01/20: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].
+2004/01/20: [dist] change Makefile.in.
+2004/01/20: [spec] add \p{...}, \P{...} in char class.
+2004/01/20: [new] character property operators \p{...}, \P{...}.
+ supported in ONIG_SYNTAX_JAVA and ONIG_SYNTAX_PERL.
+2004/01/19: [spec] allow /a{,n}/ as /a{0,n}/. (but don't allow /a{,}/)
+2004/01/19: [dist] rename onigcomp200.h to onigcmpt200.h.
+2004/01/19: [dist] update re.c.168.patch. svn add re.c.181.patch.
+2004/01/16: [dist] update sample/*.c for new API.
+2004/01/16: [dist] add onigcomp200.h. (for old API compatibility)
+2004/01/16: [dist] update documents API, RE and RE.ja.
+2004/01/16: [spec] change prefix REG_ -> ONIG_, regex_ onig_,
+ ENC_ -> ONIGENC, enc_ -> onigenc_.
+2004/01/15: [impl] rename ENC_IS_MBC_E_WORD() to ENC_IS_MBC_WORD().
+ rename ENC_CTYPE_SUPPORT_LEVEL_SB_ONLY to
+ ENC_CTYPE_SUPPORT_LEVEL_SB.
+2004/01/14: [impl] rename UNALIGNED_WORD_ACCESS to
+ PLATFORM_UNALIGNED_WORD_ACCESS.
+2004/01/14: [impl] change MATCH_STACK_LIMIT_SIZE value from 200000 to 500000.
+2004/01/13: [impl] remove ENC_CODE_TO_MBC_FIRST(enc,code) in regenc.h.
+ remove code_to_mbc_first member in RegCharEncodingType.
+2004/01/13: [impl] remove head byte bitset information in cclass->mbuf.
+2003/12/26: [impl] change macro name ismb_xxxx() in enc/*.c for
+ escape conflict.
+
+2003/12/24: Version 2.0.0
+
+2003/12/24: [spec] ignore case option is effective to numbered char.
+ ex. /\x61/i =~ "A"
+2003/12/24: [test] success in ruby 1.8.1 (2003-12-24) [i686-linux].
+2003/12/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].
+2003/12/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].
+2003/12/24: [test] success in regex.c compile test on ruby-m17n.
+ (but can't make miniruby because re.c patch fail.)
+2003/12/24: [bug] (thanks H.Miyamoto) /[\W]/ was wrong in 1.9.5.
+2003/12/22: [spec] implement fold match on UTF-8 encoding.
+2003/12/19: [impl] add ctype_support_level and ctype_add_codes() member to
+ RegCharEncoding type.
+2003/12/19: [impl] add add_ctype_to_cc() in regparse.c.
+2003/12/19: [impl] add enc_is_code_ctype() in REG_RUBY_M17N case.
+2003/12/19: [impl] change ENC_CODE_TO_MBC() interface.
+2003/12/18: [new] implement fold match. (variable number of char
+ match in ignore case mode.)
+ ex. German alphabet ess-tsett(U+00DF) match "SS" and "ss".
+2003/12/17: [impl] refactoring of encoding system.
+2003/12/17: [impl] add enc_init() in regenc.c.
+2003/12/17: [new] support Big5. (REG_ENCODING_BIG5)
+2003/12/16: [impl] change CodePoint from unsigned int to unsigned long.
+2003/12/16: [new] support ISO 8859-15. (REG_ENCODING_ISO_8859_15)
+2003/12/16: [impl] change P_() macro definition condition for Win32.
+2003/12/16: [dist] add sample/encode.c
+2003/12/16: [new] support ISO 8859-1. (REG_ENCODING_ISO_8859_1)
+2003/12/15: [impl] rename IS_ENC_XXXX to ENC_IS_XXXX.
+2003/12/15: [impl] rename RegDefaultCharEncoding to EncDefaultCharEncoding.
+2003/12/15: [impl] divide encoding files. (enc/ascii.c, enc/utf8.c etc...)
+2003/12/15: [bug] unexpected infinite loop in regex_snprintf_with_pattern().
+ change local var. type char* to UChar*.
+2003/12/15: [impl] remove REG_MBLEN_TABLE[].
+2003/12/15: [spec] rename function prefix regex_get_prev_char_head(),
+ regex_get_left_adjust_char_head() and
+ regex_get_right_adjust_char_head() to enc_xxxxxx().
+2003/12/15: [impl] rename function prefixes in regenc.h from regex_ to enc_.
+2003/12/12: [impl] remove USE_SBMB_CLASS.
+2003/12/12: [impl] rename mb -> mbc, mblen() to enc_len().
+2003/12/12: [impl] rename WCINT to CodePoint.
+2003/12/11: [impl] delete IS_XXXX() ctype macros from regint.h.
+2003/12/11: [impl] add enc->wc_is_ctype() and RegAsciiCtypeTable[256].
+2003/12/11: [impl] remove RegAsciiCaseAmbigTable.
+2003/12/10: [impl] use ENC_TO_LOWER() for ignore case comparison.
+2003/12/08: [impl] *** re-defined RegCharEncoding in oniguruma.h. ***
+2003/12/08: [impl] add USE_POSIX_REGION_OPTION to regint.h.
+2003/12/08: [impl] add IS_ENC_WORD() to regenc.h.
+2003/12/05: [impl] rename IS_CODE_XXXX() to IS_ENC_XXXX().
+2003/12/05: [impl] delete IS_CODE_WORD() from regenc.h.
+2003/12/04: [spec] rename REG_SYN_OP_BACK_REF to REG_SYN_OP_DECIMAL_BACKREF.
+2003/12/04: [spec] add (REG_SYN_OP_ESC_W_WORD | REG_SYN_OP_ESC_B_WORD_BOUND |
+ REG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | REG_SYN_OP_BACK_REF)
+ to RegSyntaxGrep.
+2003/12/04: [spec] remove REG_ENCODING_DEFAULT and REGCODE_DEFAULT.
+2003/12/04: [spec] move declarations of regex_get_default_encoding() and
+ regex_set_default_encoding() from oniguruma.h to regenc.h.
+2003/12/03: [new] add regex_get_default_encoding() and
+ regex_set_default_encoding().
+2003/12/03: [spec] REG_ENCODING_DEFAULT meaning is changed.
+ (current default value, not initial default value.)
+2003/12/03: [spec] REGCODE_XXX is obsoleted. use REG_ENCODING_XXX.
+2003/12/02: [memo] alias svnst='svn status | grep -v "^\?"'
+2003/12/02: [spec] move regex_set_default_trans_table() declaration
+ from oniguruma.h to regenc.h. (obsoleted API)
+2003/12/02: [impl] move variables RegDefaultCharEncoding, DefaultTransTable and
+ AmbiguityTable to regenc.c.
+2003/12/01: [impl] add regex_continuous_sbmb() to regenc.c.
+2003/12/01: [dist] add regenc.h and regenc.c.
+2003/11/18: [dist] change testconv.rb.
+2003/11/18: [bug] (thanks Masaru Tsuda)
+ memory leak in parse_subexp().
+2003/11/18: [bug] (thanks Masaru Tsuda)
+ memory leak in names_clear() and parse_char_class().
+2003/11/17: [bug] memory leak in parse_char_class().
+2003/11/17: [bug] (thanks Masaru Tsuda)
+ OptExactInfo length should not over OPT_EXACT_MAXLEN.
+ (concat_opt_exact_info_str())
+
+2003/11/12: Version 1.9.5
+
+2003/11/12: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].
+2003/11/12: [test] success in ruby 1.8.1 (2003-11-11) [i686-linux].
+2003/11/12: [spec] add definition of REG_INEFFECTIVE_META_CHAR.
+2003/11/11: [dist] add a sample program sample/sql.c.
+2003/11/11: [new] add variable meta character.
+ regex_set_meta_char()
+2003/11/11: [spec] add syntax op. REG_SYN_OP_VARIABLE_META_CHARS.
+2003/11/11: [spec] rename REG_SYN_OP_ESC_CAPITAL_Q_QUOTE to
+ REG_SYN_OP2_ESC_CAPITAL_Q_QUOTE,
+ REG_SYN_OP_QMARK_GROUP_EFFECT to
+ REG_SYN_OP2_QMARK_GROUP_EFFECT.
+2003/11/06: [impl] define THREAD_PASS as rb_thread_schedule() in Ruby mode.
+2003/11/05: [spec] add syntax behavior REG_SYN_WARN_REDUNDANT_NESTED_REPEAT.
+2003/11/05: [spec] rename REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED to
+ REG_SYN_WARN_CC_OP_NOT_ESCAPED.
+2003/11/04: [new] add regex_set_warn_func() and regex_set_verb_warn_func().
+2003/10/30: [new] add regex_name_to_backref_number().
+ (for multiplex definition name, see sample/names.c)
+2003/10/30: [spec] add name_end and reg argument to callback function of
+ regex_foreach_name(). (see sample/names.c)
+2003/10/29: [spec] add syntax behavior REG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME.
+ add error code REGERR_MULTIPLEX_DEFINED_NAME.
+2003/10/14: [dist] modify sample/simple.c.
+2003/10/03: [bug] (thanks nobu) [ruby-dev:21472]
+ sub-anchor of optimization map info was wrong
+ in concat_left_node_opt_info().
+ ex. /^(x?y)/ = "xy" fail.
+
+2003/09/17: Version 1.9.4
+
+2003/09/17: [spec] change specification of char-class range in ignore case mode
+ follows with Ruby 1.8(2003-09-17).
+ ex. /[H-c]/i ==> (H-Z, 0x5b-0x60, a-c)/i
+ ==> H-Z, h-z, 0x5b-0x60, a-c, A-C
+2003/09/16: [bug] (thanks Guy Decoux)
+ remove env->option == option check in parse_effect().
+ change env->option for dynamic option in parse_exp().
+ (ex. bad match /(?i)(?-i)a/ =~ "A")
+2003/09/12: [spec] rename REG_SYN_ALLOW_RANGE_OP_IN_CC to
+ REG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC,
+ REG_SYN_ESCAPE_IN_CC to REG_SYN_BACKSLASH_ESCAPE_IN_CC.
+2003/09/11: [bug] change to IS_SYNTAX_OP2 at REG_SYN_OP2_ESC_GNU_BUF_ANCHOR.
+2003/09/09: [spec] rename REG_SYN_OP2_ESC_M_BAR_META to
+ REG_SYN_OP2_ESC_CAPITAL_M_BAR_META,
+ REG_SYN_OP_ESC_Q_QUOTE to REG_SYN_OP_ESC_CAPITAL_Q_QUOTE,
+ REG_SYN_OP_ESC_SUBEXP to REG_SYN_OP_ESC_LPAREN_SUBEXP,
+ REG_SYN_OP_ESC_BUF_ANCHOR to REG_SYN_OP_ESC_AZ_BUF_ANCHOR,
+ REG_SYN_OP_ESC_GNU_BUF_ANCHOR to
+ REG_SYN_OP2_ESC_GNU_BUF_ANCHOR,
+ REG_SYN_OP_ESC_CONTROL_CHAR to REG_SYN_OP_ESC_CONTROL_CHARS,
+ REG_SYN_OP_ESC_WORD to REG_SYN_OP_ESC_W_WORD,
+ REG_SYN_OP_ESC_WORD_BEGIN_END to
+ REG_SYN_OP_ESC_LTGT_WORD_BEGIN_END,
+ REG_SYN_OP_ESC_WORD_BOUND to REG_SYN_OP_ESC_B_WORD_BOUND,
+ REG_SYN_OP_ESC_WHITE_SPACE to REG_SYN_OP_ESC_S_WHITE_SPACE,
+ REG_SYN_OP_ESC_DIGIT to REG_SYN_OP_ESC_D_DIGIT,
+ REG_SYN_OP_CC to REG_SYN_OP_BRACKET_CC,
+ REG_SYN_OP2_CCLASS_SET to REG_SYN_OP2_CCLASS_SET_OP,
+ REG_SYN_CONTEXT_INDEP_OPS to
+ REG_SYN_CONTEXT_INDEP_REPEAT_OPS,
+ REG_SYN_CONTEXT_INVALID_REPEAT_OPS to
+ REG_SYN_CONTEXT_INVALID_REPEAT_OPS.
+ add REG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR.
+2003/09/08: [spec] rename REG_SYN_OP_ANYCHAR to REG_SYN_OP_DOT_ANYCHAR,
+ REG_SYN_OP_0INF to REG_SYN_OP_ASTERISK_ZERO_INF,
+ REG_SYN_OP_ESC_0INF to REG_SYN_OP_ESC_ASTERISK_ZERO_INF,
+ REG_SYN_OP_1INF to REG_SYN_OP_PLUS_ONE_INF,
+ REG_SYN_OP_ESC_1INF to REG_SYN_OP_ESC_PLUS_ONE_INF,
+ REG_SYN_OP_0INF to REG_SYN_OP_QMARK_ZERO_ONE,
+ REG_SYN_OP_ESC_0INF to REG_SYN_OP_ESC_QMARK_ZERO_ONE,
+ REG_SYN_OP_INTERVAL to REG_SYN_OP_BRACE_INTERVAL,
+ REG_SYN_OP_ESC_INTERVAL to REG_SYN_OP_ESC_BRACE_INTERVAL,
+ REG_SYN_OP_SUBEXP to REG_SYN_OP_LPAREN_SUBEXP,
+ REG_SYN_OP_ALT to REG_SYN_OP_VBAR_ALT,
+ REG_SYN_OP_ESC_ALT to REG_SYN_OP_ESC_VBAR_ALT,
+ REG_SYN_OP_NON_GREEDY to REG_SYN_OP_QMARK_NON_GREEDY,
+ REG_SYN_OP_SUBEXP_EFFECT to REG_SYN_OP_QMARK_GROUP_EFFECT,
+ REG_SYN_OP2_POSSESSIVE_{REPEAT,INTERVAL} to
+ REG_SYN_OP2_PLUS_POSSESSIVE_{REPEAT,INTERVAL},
+ REG_SYN_OP2_SUBEXP_CALL to REG_SYN_OP2_ESC_G_SUBEXP_CALL,
+ REG_SYN_OP2_NAMED_GROUP to REG_SYN_OP2_QMARK_LT_NAMED_GROUP
+ and REG_SYN_OP2_ESC_K_NAMED_BACKREF.
+2003/09/02: [tune] call reduce_nested_qualifier() after disabling capture for
+ no-name group in noname_disable_map().
+ ex. /(a+)*(?<name>...)/
+2003/09/02: [impl] include <stdio.h> is forgotten to erase in regcomp.c.
+2003/09/01: [dist] update doc/RE and doc/RE.ja.
+2003/08/26: [bug] (thanks Guy Decoux)
+ should not double free node at the case TK_CC_CC_OPEN
+ in parse_char_class().
+
+2003/08/19: Version 1.9.3
+
+2003/08/19: [inst] change re.c.180.patch.
+2003/08/19: [impl] rename 'list of captures' to 'capture history'.
+2003/08/19: [dist] add doc/RE.ja. (Japanese)
+2003/08/19: [new] add regex_copy_syntax().
+2003/08/19: [spec] rename REG_SYN_OP2_ATMARK_LIST_OF_CAPTURES to
+ REG_SYN_OP2_ATMARK_CAPTURE_HISTORY.
+2003/08/18: [spec] (thanks nobu)
+ don't use IMPORT in oniguruma.h and onigposix.h.
+2003/08/18: [impl] (thanks nobu) change error output to stdout in testconv.rb.
+2003/08/18: [inst] (thanks nobu) lacked $(srcdir) in Makefile.in.
+2003/08/18: [bug] REG_MBLEN_TABLE[SJIS][0xFD-0xFF] should be 1.
+2003/08/18: [bug] (thanks nobu) mbctab_sjis[0x80] should be 0.
+2003/08/18: [bug] (thanks nobu)
+ single/multi-byte decision was wrong in parse_char_class().
+ add regex_wc2mblen().
+ should not set fetched to 1 in TK_RAW_BYTE case.
+2003/08/18: [bug] should update BitSet in the case inc_n >= 0
+ in add_wc_range_to_buf().
+2003/08/13: [bug] change re.c.180.patch for fix rb_reg_to_s() in re.c.
+2003/08/11: [bug] should clear region->list in regex_region_resize().
+
+2003/08/08: Version 1.9.2
+
+2003/08/08: [test] success in ruby 1.8.0 (2003-08-08) on Windows 2000
+ VC++ 6.0 and Cygwin.
+2003/08/08: [impl] don't define macro vsnprintf for WIN32 platform,
+ because definition is added in win32\win32.h.
+2003/08/08: [test] success in ruby 1.8.0 and ruby 1.6.8(2003-08-03) on Linux.
+2003/08/08: [dist] change re.c.180.patch and re.c.168.patch.
+2003/08/08: [new] (thanks akr)
+ implemented list of captures. (?@...), (?@<name>...)
+2003/08/07: [dist] add sample/listcap.c.
+2003/08/06: [bug] OP_MEMORY_END_PUSH_REC case in match_at().
+ renewal of mem_start_stk[] should be after
+ STACK_PUSH_MEM_END() call.
+2003/07/29: [new] add regex_get_encoding(), regex_get_options() and
+ regex_get_syntax().
+2003/07/25: [spec] (thanks akr)
+ change group(...) to shy-group(?:...) if named group is
+ used in the pattern.
+ add REG_SYN_CAPTURE_ONLY_NAMED_GROUP.
+2003/07/24: [spec] rename REG_OPTION_CAPTURE_ONLY_NAMED_GROUP to
+ REG_OPTION_DONT_CAPTURE_GROUP.
+ add REG_OPTION_CAPTURE_GROUP.
+2003/07/17: [spec] rename REG_SYN_OP2_NAMED_SUBEXP to REG_SYN_OP2_NAMED_GROUP.
+2003/07/17: [spec] add REGERR_EMPTY_GROUP_NAME.
+2003/07/17: [spec] rename REGERR_INVALID_SUBEXP_NAME
+ to REGERR_INVALID_CHAR_IN_GROUP_NAME.
+2003/07/17: [spec] restrict usable chars of group name to alphabet, digit,
+ '_' or multibyte-char in fetch_name(). [ruby-dev:20706]
+2003/07/16: [impl] minor change of sample/names.c.
+2003/07/14: [impl] rename USE_NAMED_SUBEXP to USE_NAMED_GROUP.
+2003/07/14: [bug] add fetch_name() for USE_NAMED_SUBEXP off case.
+2003/07/14: [API] add regex_number_of_names().
+2003/07/08: [impl] change error message for undefined group number call.
+ 'undefined group reference: /(a)\g<2>/'
+ --> 'undefined group <2> reference: /(a)\g<2>/'
+2003/07/08: [dist] modify doc/RE.
+2003/07/07: [impl] OP_SET_OPTION is not needed in compiled code.
+ add IS_DYNAMIC_OPTION() to regint.h.
+2003/07/07: [spec] called group should not ignore outside option (?i:...).
+ ex. /(?i:(?<n>(a)\2)){0}\g<n>/.match("aA")
+ add opcode OP_BACKREFN_IC and OP_BACKREF_MULTI_IC.
+ set option status to effect memory in optimize_node_left().
+2003/07/07: [impl] add opcode OP_ANYCHAR_ML, OP_ANYCHAR_ML_STAR and
+ OP_ANYCHAR_ML_START_PEEK_NEXT.
+2003/07/07: [bug] (thanks nobu) REG_MBLEN_TABLE[SJIS][0x80] should be 1.
+2003/07/07: [spec] rename REG_SYN_OP_QUOTE to REG_SYN_OP_ESC_Q_QUOTE.
+
2003/07/04: Version 1.9.1
2003/07/04: [new] add REG_OPTION_CAPTURE_ONLY_NAMED_GROUP. (thanks .NET)
2003/07/04: [spec] check mbuf member in the case of
REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC in parse_char_class().
-2003/07/04: [impl] typo REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED.
+2003/07/04: [spec] typo REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED.
should be REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED.
2003/07/04: [bug] conflict values on REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED and
REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC. (thanks nobu)
2003/06/20: Version 1.9.0
-2003/06/20: [spec] \Q...\E is not effective on REG_SYNTAX_RUBY.
+2003/06/20: [spec] \Q...\E is not effective on REG_SYNTAX_RUBY. (thanks akr)
2003/06/19: [inst] rename regex.h to oniguruma.h.
2003/06/18: [impl] change REG_EXTERN setting condition. (__CYGWIN__)
2003/06/18: [bug] return wrong result UTF-8 case in regex_mb2wc().
2003/06/13: [bug] should use -DIMPORT for link with DLL in win32/Makefile.
2003/06/13: [dist] add sample/names.c
2003/06/12: [bug] range should be from - 1 in not_wc_range_buf().
-2003/06/12: [spec] should warn for '-' befor '&&' operator in char-class.
+2003/06/12: [spec] should warn for '-' before '&&' operator in char-class.
2003/06/12: [new] add REG_SYNTAX_PERL.
2003/06/12: [spec] add syntax behavior REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED.
2003/06/12: [spec] invalid POSIX bracket should be error. ex. [[:upper :]]
--
[bug: bug fix]
+[API: API change/new/delete]
[new: new feature]
[spec: specification change]
[impl: implementation change]
[dist: distribution change]
[test: test]
[memo: memo]
+--
+<create tag>
+svn copy http://localhost/repos/trunk/oniguruma http://localhost/repos/tags/oniguruma/X.X.X -m "onigdXXXXXXXX"
+++ /dev/null
-INSTALL-RUBY 2003/06/12
-
-The way of installing into Ruby is shown.
-First, prepare for the source of Ruby.
-(http://www.ruby-lang.org/)
-
-A. Unix or Cygwin platform
-B. Win32 platform (VC++)
-
-
-A. Unix or Cygwin platform
-
- (in oniguruma directory)
- 1. ./configure --with-rubydir=<ruby-source-dir>
- 2. make 16 # for Ruby 1.6.8
- or
- make 18 # for Ruby 1.8.0
-
- Or you can specify ruby source directory.
- (ex. make 16 RUBYDIR=../ruby)
-
- (in ruby source directory)
- 3. ./configure (** If it doesn't go yet. **)
- 4. make clean
- 5. make
-
-
- * test (ASCII and EUC-JP)
-
- (in oniguruma directory)
- 6. make rtest
- Or you can specify ruby program directory.
- (ex. make rtest RUBYDIR=/usr/local/bin)
-
-
-B. Win32 platform (VC++)
-
- * Requirement: Visual C++, patch.exe
-
- (in oniguruma directory)
- 1. copy win32\Makefile Makefile
- 2. nmake 16 RUBYDIR=<ruby-source-dir> # for Ruby 1.6.8
- or
- nmake 18 RUBYDIR=<ruby-source-dir> # for Ruby 1.8.0
-
- 3. Follow <ruby-source-dir>\win32\README.win32 description...
-
-// END
+++ /dev/null
-# Oni Guruma Makefile
-
-product_name = oniguruma
-dist_tag = `date '+%Y%m%d'`
-
-SHELL = /bin/sh
-AUTOCONF = autoconf
-
-CPPFLAGS =
-CFLAGS = @CFLAGS@ @STATISTICS@
-LDFLAGS =
-LOADLIBES =
-AR = ar
-ARFLAGS = rc
-RANLIB = @RANLIB@
-INSTALL = install -c
-CP = cp -p
-CC = @CC@
-DEFS = @DEFS@ -DNOT_RUBY
-RUBYDIR = @RUBYDIR@
-WIN32 = win32
-DOC = doc
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-libdir = $(exec_prefix)/lib
-includedir = $(prefix)/include
-
-subdirs =
-
-libname = libonig.a
-
-onigintheaders = regint.h regparse.h
-onigheaders = oniguruma.h $(onigintheaders)
-posixheaders = onigposix.h
-headers = $(posixheaders) $(onigheaders)
-
-onigobjs = regerror.o regparse.o regcomp.o regexec.o reggnu.o
-posixobjs = regposix.o regposerr.o
-libobjs = $(onigobjs) $(posixobjs)
-
-onigsources = regerror.c regparse.c regcomp.c regexec.c reggnu.c
-posixsources = regposix.c regposerr.c
-libsources = $(posixsources) $(onigsources)
-rubysources = regex.c $(onigsources)
-
-patchfiles = re.c.168.patch re.c.180.patch
-distfiles = README COPYING INSTALL-RUBY HISTORY \
- .cvsignore Makefile.in configure.in config.h.in configure \
- $(headers) $(libsources) regex.c $(patchfiles) \
- test.rb testconv.rb $(testc).c
-win32distfiles = $(WIN32)/Makefile $(WIN32)/config.h $(WIN32)/testc.c
-docfiles = $(DOC)/API $(DOC)/RE
-
-samplefiles = sample/*.c
-
-testc = testc
-testp = testp
-
-makeargs = $(MFLAGS) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' CC='$(CC)'
-
-.SUFFIXES:
-.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
-
-.c.o:
- $(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) -I. -I$(srcdir) -c $<
-
-# targets
-default: all
-
-all: $(libname)
-
-$(libname): $(libobjs)
- rm -f $(libname)
- $(AR) $(ARFLAGS) $(libname) $(libobjs)
- $(RANLIB) $(libname)
-
-regparse.o: regparse.c $(onigheaders) config.h
-regcomp.o: regcomp.c $(onigheaders) config.h
-regexec.o: regexec.c regint.h oniguruma.h config.h
-reggnu.o: reggnu.c regint.h oniguruma.h config.h
-regerror.o: regerror.c regint.h oniguruma.h config.h
-regposix.o: regposix.c $(posixheaders) oniguruma.h config.h
-regposerr.o: regposerr.c $(posixheaders) config.h
-
-install: all
- test -d $(libdir) || mkdir $(libdir)
- test -d $(includedir) || mkdir $(includedir)
- $(INSTALL) $(libname) $(libdir)/$(libname)
- $(RANLIB) $(libdir)/$(libname)
- $(INSTALL) $(srcdir)/oniguruma.h $(includedir)/oniguruma.h
- $(INSTALL) $(srcdir)/onigposix.h $(includedir)/onigposix.h
-
-uninstall:
- -rm -f $(libdir)/$(libname)
- -rm -f $(includedir)/oniguruma.h
-
-# Ruby test
-rtest:
- $(RUBYDIR)/ruby -w -Ke test.rb
-
-# C library test
-ctest: $(testc)
- ./$(testc)
-
-# POSIX C library test
-ptest: $(testp)
- ./$(testp)
-
-$(testc): $(testc).c $(libname)
- $(CC) $(CFLAGS) -o $@ $(testc).c $(libname)
-
-$(testp): $(testc).c $(libname)
- $(CC) -DPOSIX_TEST $(CFLAGS) -o $@ $(testc).c $(libname)
-
-$(testc).c: test.rb testconv.rb
- ruby -Ke testconv.rb < test.rb > $@
-
-$(WIN32)/$(testc).c: test.rb testconv.rb
- ruby -Ke testconv.rb -win < test.rb | nkf -cs > $@
-
-clean:
- rm -f *.o $(libname) $(testc) $(testp) $(testc) *~ win32/*~
-
-distclean: clean
- rm -f Makefile config.status
-
-
-16: cpruby
- patch -d $(RUBYDIR) -p0 < re.c.168.patch
-
-18: cpruby
- patch -d $(RUBYDIR) -p0 < re.c.180.patch
-
-# backup file suffix
-SORIG = ruby_orig
-
-cpruby:
- $(CP) $(RUBYDIR)/regex.c $(RUBYDIR)/regex.c.$(SORIG)
- $(CP) $(RUBYDIR)/regex.h $(RUBYDIR)/regex.h.$(SORIG)
- $(CP) $(RUBYDIR)/re.c $(RUBYDIR)/re.c.$(SORIG)
- $(CP) $(rubysources) $(onigintheaders) $(RUBYDIR)
- $(CP) oniguruma.h $(RUBYDIR)/regex.h
-
-rback:
- $(CP) $(RUBYDIR)/regex.c.$(SORIG) $(RUBYDIR)/regex.c
- $(CP) $(RUBYDIR)/regex.h.$(SORIG) $(RUBYDIR)/regex.h
- $(CP) $(RUBYDIR)/re.c.$(SORIG) $(RUBYDIR)/re.c
-
-samples:
- $(CC) $(CFLAGS) -I. -o sample/simple sample/simple.c $(libname)
- $(CC) $(CFLAGS) -I. -o sample/posix sample/posix.c $(libname)
- $(CC) $(CFLAGS) -I. -o sample/names sample/names.c $(libname)
-
-configure: configure.in
- $(AUTOCONF)
-
-config.status: configure
- $(SHELL) ./config.status --recheck
-
-Makefile: Makefile.in config.status
- $(SHELL) ./config.status
-
-# Prevent GNU make 3 from overflowing arg limit on system V.
-.NOEXPORT:
-
-manifest:
- for file in $(distfiles); do echo $$file; done
-
-
-distdir = $(product_name)
-
-dist_auto: $(testc).c $(WIN32)/$(testc).c
-
-dist: configure dist_auto
- rm -rf $(distdir)
- mkdir $(distdir)
- mkdir $(distdir)/$(DOC)
- mkdir $(distdir)/$(WIN32)
- mkdir $(distdir)/sample
- ln $(distfiles) $(distdir)
- ln $(docfiles) $(distdir)/$(DOC)
- ln $(win32distfiles) $(distdir)/$(WIN32)
- ln $(samplefiles) $(distdir)/sample
- tar chf - $(distdir) | gzip > onigd$(dist_tag).tar.gz
- rm -rf $(distdir)
-README 2003/07/04
+README 2004/02/25
Oniguruma ---- (C) K.Kosako <kosako@sofnec.co.jp>
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/oniguruma/
+http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/oniguruma/
-Oniguruma is a regular expression library.
-The characteristics of this library is that different character encodings
+Oniguruma is a regular expressions library.
+The characteristics of this library is that different character encoding
for every regular expression object can be specified.
-(Supported character encodings: ASCII, UTF-8, EUC-JP, Shift_JIS)
+
+Supported character encodings:
+
+ ASCII, UTF-8,
+ EUC-JP, EUC-TW, EUC-KR, EUC-CN,
+ Shift_JIS, Big5, KOI8, KOI8-R,
+ ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,
+ ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,
+ ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16
+
There are two ways of using of it in this program.
* Built-in regular expression engine of Ruby
* C library (supported APIs: GNU regex, POSIX, Oniguruma native)
+------------------------------------------------------------
Install
-A. Install into Ruby
+(A) Install into Ruby
See INSTALL-RUBY.
+ (character encodings: ASCII, UTF-8, EUC-JP, Shift_JIS)
+
-B. C library
+(B) Install C library
- B1. Unix, Cygwin
+ (B-1) Unix and Cygwin platform
1. ./configure
2. make
(* uninstall: make uninstall)
- * test (EUC-JP)
+ * test (ASCII/EUC-JP)
4. make ctest
- B2. Win32 platform (VC++)
+ (B-2) Win32 platform (VC++)
- 1. copy win32\config.h config.h
- 2. copy win32\Makefile Makefile
+ 1. copy win32\Makefile Makefile
+ 2. copy win32\config.h config.h
3. nmake
- onig_s.lib: static link library
- onig.dll: dynamic link library
+ onig_s.lib: static link library
+ onig.dll: dynamic link library
- * test (Shift_JIS)
+ * test (ASCII/Shift_JIS)
4. copy win32\testc.c testc.c
5. nmake ctest
It follows the BSD license in the case of the one except for it.
-Source Files
- oniguruma.h Oniguruma and GNU regex API header file
- regint.h internal definitions
- regparse.h internal definitions for regparse.c and regcomp.c
- regparse.c parsing functions.
- regcomp.c compiling and optimization functions
- regerror.c error message function
- regex.c source files wrapper for Ruby
- regexec.c search and match functions
- reggnu.c GNU regex API functions
+Regular Expressions
+
+ See doc/RE (or doc/RE.ja for Japanese).
+
- onigposix.h POSIX API header file
- regposerr.c POSIX API error message function (regerror)
- regposix.c POSIX API functions
+Sample Programs
sample/simple.c example of the minimum (native API)
- sample/posix.c POSIX API sample.
sample/names.c example of the named group callback.
+ sample/encode.c example of some encodings.
+ sample/listcap.c example of the capture history.
+ sample/posix.c POSIX API sample.
+ sample/sql.c example of the variable meta characters.
+ (SQL-like pattern matching)
+
+Source Files
-Regular expression
+ oniguruma.h Oniguruma API header file. (public)
+ oniggnu.h GNU regex API header file. (public)
+ onigcmpt200.h Oniguruma API backward compatibility header file. (public)
+ (for 2.0.0 or more older version)
+
+ regenc.h character encodings framework header file.
+ regint.h internal definitions
+ regparse.h internal definitions for regparse.c and regcomp.c
+ regcomp.c compiling and optimization functions
+ regenc.c character encodings framework.
+ regerror.c error message function
+ regex.c source files wrapper for Ruby
+ regexec.c search and match functions
+ regparse.c parsing functions.
+ reggnu.c GNU regex API functions
+
+ onigposix.h POSIX API header file. (public)
+ regposerr.c POSIX error message function.
+ regposix.c POSIX functions.
+
+ enc/mktable.c character type table generator.
+ enc/ascii.c ASCII encoding.
+ enc/iso8859_1.c ISO-8859-1 encoding. (Latin-1)
+ enc/iso8859_2.c ISO-8859-2 encoding. (Latin-2)
+ enc/iso8859_3.c ISO-8859-3 encoding. (Latin-3)
+ enc/iso8859_4.c ISO-8859-4 encoding. (Latin-4)
+ enc/iso8859_5.c ISO-8859-5 encoding. (Cyrillic)
+ enc/iso8859_6.c ISO-8859-6 encoding. (Arabic)
+ enc/iso8859_7.c ISO-8859-7 encoding. (Greek)
+ enc/iso8859_8.c ISO-8859-8 encoding. (Hebrew)
+ enc/iso8859_9.c ISO-8859-9 encoding. (Latin-5 or Turkish)
+ enc/iso8859_10.c ISO-8859-10 encoding. (Latin-6 or Nordic)
+ enc/iso8859_11.c ISO-8859-11 encoding. (Thai)
+ enc/iso8859_13.c ISO-8859-13 encoding. (Latin-7 or Baltic Rim)
+ enc/iso8859_14.c ISO-8859-14 encoding. (Latin-8 or Celtic)
+ enc/iso8859_15.c ISO-8859-15 encoding. (Latin-9 or West European with Euro)
+ enc/iso8859_16.c ISO-8859-16 encoding.
+ (Latin-10 or South-Eastern European with Euro)
+ enc/utf8.c UTF-8 encoding.
+ enc/euc_jp.c EUC-JP encoding.
+ enc/euc_tw.c EUC-TW encoding.
+ enc/euc_kr.c EUC-KR, EUC-CN encoding.
+ enc/sjis.c Shift_JIS encoding.
+ enc/koi8.c KOI8 encoding.
+ enc/koi8_r.c KOI8-R encoding.
+ enc/big5.c Big5 encoding.
- See doc/RE.
API differences with Japanized GNU regex(version 0.12) of Ruby
ToDo
- 1 support 16-bit and 31-bit encodings. (UCS-2, UCS-4, UTF-16)
- (each encoding has meta-character code table?)
-
- 2 if-then-else. (?(condition)then), (?(condition)then|else)
+ 1 support 16-bit encodings. (UTF-16)
+ 2 different encoding pattern with target.
+ (ex. ASCII/UTF-16, UTF-16 BE and UTF-16 LE)
+ 3 add enc/name.c (onigenc_get_enc_by_name(name))
- ? variable meta characters.
- ? implement syntax behavior REG_SYN_CONTEXT_INDEP_ANCHORS.
- ? pattern encoding different with target.
- (ex. UCS-2 Big Endian and UCS-2 Little Endian)
- ? better acess to hash table.
+ ? transmission stopper. (return ONIG_STOP from match_at())
+ ? implement syntax behavior ONIG_SYN_CONTEXT_INDEP_ANCHORS.
+ ? better acess to hash table (st.c).
non null-terminated key version st_lookup().
- (but it needs to modify st.[ch])
- ? character set specific POSIX bracket extensions. ([:hiragana:])
- ? grep-like tool 'onigrep'. (variable syntax option etc..)
- ? check invalid wide char value in WC2MB, WC2MB_FIRST on Ruby M17N.
- ? define THREAD_PASS in regint.h as rb_thread_pass().
-
+ ? grep-like tool 'onigrep'.
+ ? return parse tree of regexp pattern to application.
+ ?? /a{n}?/ should be interpreted as /(?:a{n})?/.
+ ?? \h hexadecimal digit char ([0-9a-fA-F]), \H not \h.
and I'm thankful to Akinori MUSHA.
--- /dev/null
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.53.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+ { $as_unset LANG || test "${LANG+set}" != set; } ||
+ { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+ { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+ { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+ { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+ { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+ { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+ { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+ { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+ { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+ { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+ { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+ { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+ { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+ { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+ { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conftest.sh
+ echo "exit 0" >>conftest.sh
+ chmod +x conftest.sh
+ if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conftest.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="regex.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-rubydir=RUBYDIR specify value for RUBYDIR (default ..)
+ --with-statistics take matching time statistical data
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.53. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+ case $ac_arg in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n ) continue ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ ac_sep=" " ;;
+ esac
+ # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core core.* *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+RUBYDIR=".."
+
+# Check whether --with-rubydir or --without-rubydir was given.
+if test "${with_rubydir+set}" = set; then
+ withval="$with_rubydir"
+ RUBYDIR=$withval
+fi;
+
+
+STATISTICS=""
+
+# Check whether --with-statistics or --without-statistics was given.
+if test "${with_statistics+set}" = set; then
+ withval="$with_statistics"
+ STATISTICS=-DREG_DEBUG_STATISTICS
+fi;
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$as_dir/$ac_word" ${1+"$@"}
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
+ ls a.out conftest 2>/dev/null;
+ ls a.* conftest.* 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;;
+ a.out ) # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_declaration
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+for ac_header in stdlib.h string.h strings.h sys/time.h unistd.h sys/times.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((int *) 0)
+ return 0;
+if (sizeof (int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_int=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_int" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo= ac_hi=
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5
+echo "$as_me: error: cannot compute sizeof (int), 77" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+long longval () { return (long) (sizeof (int)); }
+unsigned long ulongval () { return (long) (sizeof (int)); }
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77" >&5
+echo "$as_me: error: cannot compute sizeof (int), 77" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6
+if test "${ac_cv_type_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((short *) 0)
+ return 0;
+if (sizeof (short))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_short=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_short=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6
+
+echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6
+if test "${ac_cv_sizeof_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_short" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo= ac_hi=
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_short=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77" >&5
+echo "$as_me: error: cannot compute sizeof (short), 77" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+long longval () { return (long) (sizeof (short)); }
+unsigned long ulongval () { return (long) (sizeof (short)); }
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (short))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_short=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77" >&5
+echo "$as_me: error: cannot compute sizeof (short), 77" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_short=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((long *) 0)
+ return 0;
+if (sizeof (long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_long=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo= ac_hi=
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5
+echo "$as_me: error: cannot compute sizeof (long), 77" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling" >&5
+echo "$as_me: error: cannot run test program while cross compiling" >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+long longval () { return (long) (sizeof (long)); }
+unsigned long ulongval () { return (long) (sizeof (long)); }
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77" >&5
+echo "$as_me: error: cannot compute sizeof (long), 77" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_const=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_header_time=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo "$as_me:$LINENO: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+if test "${ac_cv_working_alloca_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <alloca.h>
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_working_alloca_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_working_alloca_h=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA_H 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+if test "${ac_cv_func_alloca_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+char *p = (char *) alloca (1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_alloca_works=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_alloca_works=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA 1
+_ACEOF
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=alloca.$ac_objext
+
+cat >>confdefs.h <<\_ACEOF
+#define C_ALLOCA 1
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+if test "${ac_cv_os_cray+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+ break
+fi
+
+ done
+fi
+
+echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+if test "${ac_cv_c_stack_direction+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+int
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+ exit (find_stack_direction () < 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_stack_direction=1
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_c_stack_direction=-1
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+echo "$as_me:$LINENO: checking for working memcmp" >&5
+echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
+if test "${ac_cv_func_memcmp_working+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_memcmp_working=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+
+ /* Some versions of memcmp are not 8-bit clean. */
+ char c0 = 0x40, c1 = 0x80, c2 = 0x81;
+ if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)
+ exit (1);
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ char foo[21];
+ char bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ char *a = foo + i;
+ char *b = bar + i;
+ strcpy (a, "--------01111111");
+ strcpy (b, "--------10000000");
+ if (memcmp (a, b, 16) >= 0)
+ exit (1);
+ }
+ exit (0);
+ }
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_memcmp_working=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+( exit $ac_status )
+ac_cv_func_memcmp_working=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5
+echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6
+test $ac_cv_func_memcmp_working = no && LIBOBJS="$LIBOBJS memcmp.$ac_objext"
+
+
+echo "$as_me:$LINENO: checking for prototypes" >&5
+echo $ECHO_N "checking for prototypes... $ECHO_C" >&6
+if test "${cv_have_prototypes+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+int foo(int x) { return 0; }
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return foo(10);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cv_have_prototypes=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cv_have_prototypes=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $cv_have_prototypes" >&5
+echo "${ECHO_T}$cv_have_prototypes" >&6
+if test "$cv_have_prototypes" = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_PROTOTYPES 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for variable length prototypes and stdarg.h" >&5
+echo $ECHO_N "checking for variable length prototypes and stdarg.h... $ECHO_C" >&6
+if test "${cv_stdarg+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#include <stdarg.h>
+int foo(int x, ...) {
+ va_list va;
+ va_start(va, x);
+ va_arg(va, int);
+ va_arg(va, char *);
+ va_arg(va, double);
+ return 0;
+}
+
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN() { return 1; }
+#endif
+int
+main ()
+{
+return foo(10, "", 3.14);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cv_stdarg=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+cv_stdarg=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $cv_stdarg" >&5
+echo "${ECHO_T}$cv_stdarg" >&6
+if test "$cv_stdarg" = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_STDARG_PROTOTYPES 1
+_ACEOF
+
+fi
+
+
+
+ac_config_files="$ac_config_files Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# NLS nuisances.
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
+ { $as_unset LANG || test "${LANG+set}" != set; } ||
+ { LANG=C; export LANG; }
+(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
+ { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
+ { LC_ALL=C; export LC_ALL; }
+(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
+ { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
+ { LC_TIME=C; export LC_TIME; }
+(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
+ { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
+ { LC_CTYPE=C; export LC_CTYPE; }
+(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
+ { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
+ { LANGUAGE=C; export LANGUAGE; }
+(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
+ { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
+ { LC_COLLATE=C; export LC_COLLATE; }
+(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
+ { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
+ { LC_NUMERIC=C; export LC_NUMERIC; }
+(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
+ { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
+ { LC_MESSAGES=C; export LC_MESSAGES; }
+
+
+# Name of the executable.
+as_me=`(basename "$0") 2>/dev/null ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conftest.sh
+ echo "exit 0" >>conftest.sh
+ chmod +x conftest.sh
+ if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conftest.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.53. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.53,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ shift
+ set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+ shift
+ ;;
+ -*);;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_need_defaults=false;;
+ esac
+
+ case $1 in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+ exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ shift
+ CONFIG_FILES="$CONFIG_FILES $1"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $1"
+ ac_need_defaults=false;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=$TMPDIR/cs$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@RUBYDIR@,$RUBYDIR,;t t
+s,@STATISTICS@,$STATISTICS,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@CPP@,$CPP,;t t
+s,@ALLOCA@,$ALLOCA,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@@,$,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" ||
+ mkdir "$as_incr_dir" ||
+ { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+done; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # egrep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" ||
+ mkdir "$as_incr_dir" ||
+ { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+done; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+++ /dev/null
-dnl Process this file with autoconf to produce a configure script.
-AC_INIT(regex.c)
-
-AC_CONFIG_HEADER(config.h)
-
-dnl default value for RUBYDIR
-RUBYDIR=".."
-AC_ARG_WITH(rubydir,
- [ --with-rubydir=RUBYDIR specify value for RUBYDIR (default ..)],
- [ RUBYDIR=$withval ])
-AC_SUBST(RUBYDIR)
-
-dnl default value for STATISTICS
-STATISTICS=""
-AC_ARG_WITH(statistics,
- [ --with-statistics take matching time statistical data],
- [ STATISTICS=-DREG_DEBUG_STATISTICS ])
-AC_SUBST(STATISTICS)
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_RANLIB
-dnl AC_PROG_INSTALL
-
-dnl Checks for libraries.
-
-dnl Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS(stdlib.h string.h strings.h sys/time.h unistd.h sys/times.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_CHECK_SIZEOF(int, 4)
-AC_CHECK_SIZEOF(short, 2)
-AC_CHECK_SIZEOF(long, 4)
-AC_C_CONST
-AC_HEADER_TIME
-
-dnl Checks for library functions.
-AC_FUNC_ALLOCA
-AC_FUNC_MEMCMP
-
-AC_CACHE_CHECK(for prototypes, cv_have_prototypes,
- [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
- cv_have_prototypes=yes,
- cv_have_prototypes=no)])
-if test "$cv_have_prototypes" = yes; then
- AC_DEFINE(HAVE_PROTOTYPES)
-fi
-
-AC_CACHE_CHECK(for variable length prototypes and stdarg.h, cv_stdarg,
- [AC_TRY_COMPILE([
-#include <stdarg.h>
-int foo(int x, ...) {
- va_list va;
- va_start(va, x);
- va_arg(va, int);
- va_arg(va, char *);
- va_arg(va, double);
- return 0;
-}
-], [return foo(10, "", 3.14);],
- cv_stdarg=yes,
- cv_stdarg=no)])
-if test "$cv_stdarg" = yes; then
- AC_DEFINE(HAVE_STDARG_PROTOTYPES)
-fi
-
-AC_SUBST()
-
-AC_OUTPUT(Makefile)
+++ /dev/null
-Oniguruma API 2003/07/04
-
-declared in regex.h.
-
-
-# int regex_init(void)
-
- Initialize library.
-
- You don't have to call it explicitly, because it is called in regex_new().
-
-
-# int regex_error_code_to_str(UChar* err_buf, int err_code, ...)
-
- Return error message string length.
-
- arguments
- 1 err_buf: error message buffer.
- (required size: REG_MAX_ERROR_MESSAGE_LEN)
- 2 err_code: error code returned from other API functions.
- 3 err_info (optional): error info returned from regex_new()
- and regex_recompile().
-
-
-# int regex_new(regex_t** reg, UChar* pattern, UChar* pattern_end,
- RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax,
- RegErrorInfo* err_info)
-
- Create new regex object(regex_t).
-
- normal return: REG_NORMAL
-
- arguments
- 1 reg: return regex object's address.
- 2 pattern: regex pattern string.
- 3 pattern_end: terminate address of pattern. (pattern + pattern length)
- 4 option: compile time options.
-
- REG_OPTION_NONE no option
- REG_OPTION_SINGLELINE '^' -> '\A', '$' -> '\z', '\Z' -> '\z'
- REG_OPTION_MULTILINE '.' match with newline
- REG_OPTION_IGNORECASE ignore case (case-insensitive)
- REG_OPTION_EXTEND extended pattern form
- REG_OPTION_FIND_LONGEST find longest match
- REG_OPTION_FIND_NOT_EMPTY ignore empty match
- REG_OPTION_NEGATE_SINGLELINE
- clear REG_OPTION_SINGLELINE which is default on
- in REG_SYNTAX_POSIX_XXX, REG_SYNTAX_PERL and REG_SYNTAX_JAVA.
- REG_OPTION_CAPTURE_ONLY_NAMED_GROUP named group only captured.
-
- 5 code: character encoding.
-
- REGCODE_ASCII ASCII
- REGCODE_UTF8 UTF-8
- REGCODE_EUCJP EUC-JP
- REGCODE_SJIS Shift_JIS
- REGCODE_DEFAULT ASCII
-
- 6 syntax: pointer to pattern syntax definition.
-
- REG_SYNTAX_POSIX_BASIC POSIX Basic RE
- REG_SYNTAX_POSIX_EXTENDED POSIX Extended RE
- REG_SYNTAX_EMACS Emacs
- REG_SYNTAX_GREP grep
- REG_SYNTAX_GNU_REGEX GNU regex
- REG_SYNTAX_JAVA Java (Sun java.util.regex)
- REG_SYNTAX_PERL Perl
- REG_SYNTAX_RUBY Ruby
- REG_SYNTAX_DEFAULT default (== Ruby)
- regex_set_default_syntax()
-
- or any RegSyntaxType data pointer defined by user.
-
- 7 err_info: address for return optional error info.
- use this value as 3rd argument of regex_error_code_to_str().
-
-
-# void regex_free(regex_t* reg)
-
- Free memory used by regex object.
-
- arguments
- 1 reg: regex object.
-
-
-# int regex_recompile(regex_t* reg, UChar* pattern, UChar* pattern_end,
- RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax,
- RegErrorInfo* err_info)
-
- Recompile regex object.
-
- normal return: REG_NORMAL
-
- arguments
- 1 reg: regex object.
-
- Another arguments are same with regex_new().
-
-
-# int regex_search(regex_t* reg, UChar* str, UChar* end, UChar* start,
- UChar* range, RegRegion* region, RegOptionType option)
-
- Search string and return search result and matching region.
-
- normal return: match position offset (i.e. p - str >= 0)
- not found: REG_MISMATCH (< 0)
-
- arguments
- 1 reg: regex object
- 2 str: target string
- 3 end: terminate address of target string
- 4 start: search start address of target string
- 5 range: search terminate address of target string
- 6 region: address for return group match range info (NULL is allowed)
- 7 option: search time option
-
- REG_OPTION_NOTBOL string head(str) isn't considered as begin of line
- REG_OPTION_NOTEOL string end (end) isn't considered as end of line
- REG_OPTION_POSIX_REGION region argument is regmatch_t[] of POSIX API.
-
-
-# int regex_match(regex_t* reg, UChar* str, UChar* end, UChar* at,
- RegRegion* region, RegOptionType option)
-
- Match string and return result and matching region.
-
- normal return: match length (i.e. p - at >= 0)
- not match: REG_MISMATCH (< 0)
-
- arguments
- 1 reg: regex object
- 2 str: target string
- 3 end: terminate address of target string
- 4 at: match address of target string
- 5 region: address for return group match range info (NULL is allowed)
- 6 option: search time option
-
- REG_OPTION_NOTBOL string head(str) isn't considered as begin of line
- REG_OPTION_NOTEOL string end (end) isn't considered as end of line
- REG_OPTION_POSIX_REGION region argument is regmatch_t[] of POSIX API.
-
-
-# RegRegion* regex_region_new(void)
-
- Create a region.
-
-
-# void regex_region_free(RegRegion* region, int free_self)
-
- Free memory used by region.
-
- arguments
- 1 region: target region
- 2 free_self: [1: free all, 0: free memory used in region but not self]
-
-
-# void regex_region_copy(RegRegion* to, RegRegion* from)
-
- Copy contents of region.
-
- arguments
- 1 to: target region
- 2 from: source region
-
-
-# void regex_region_clear(RegRegion* region)
-
- Clear contents of region.
-
- arguments
- 1 region: target region
-
-
-# int regex_region_resize(RegRegion* region, int n)
-
- Resize group range area of region.
-
- normal return: REG_NORMAL
-
- arguments
- 1 region: target region
- 2 n: new size
-
-
-# int regex_name_to_group_numbers(regex_t* reg, UChar* name, UChar* name_end,
- int** num_list)
-
- Return group number list of name.
- Named subexp is defined by (?<name>....).
-
- normal return: number of groups for the name.
- (ex. /(?<x>..)...(?<x>..)/ ==> 2)
- name not found: -1
-
- arguments
- 1 reg: regex object.
- 2 name: subexp-name.
- 3 name_end: terminate address of subexp-name.
- 4 num_list: return list of group number.
-
-
-# int regex_foreach_names(regex_t* reg, int (*func)(UChar*,int,int*,void*),
- void* arg)
-
- Iterate function call for all names.
-
- normal return: 0
- error: func's return value.
-
- arguments
- 1 reg: regex object.
- 2 func: called function.
- func(name, <number of groups>, <group number's list>, arg);
- if func return non 0 value, iteration is stopped.
- 3 arg: argument for func.
-
-
-# UChar* regex_get_prev_char_head(RegCharEncoding code, UChar* start, UChar* s)
-
- Return previous character head address.
-
- arguments
- 1 code: character encoding
- 2 start: string address
- 3 s: target address of string
-
-
-# UChar* regex_get_left_adjust_char_head(RegCharEncoding code,
- UChar* start, UChar* s)
-
- Return left-adjusted head address of a character.
-
- arguments
- 1 code: character encoding
- 2 start: string address
- 3 s: target address of string
-
-
-# UChar* regex_get_right_adjust_char_head(RegCharEncoding code,
- UChar* start, UChar* s)
-
- Return right-adjusted head address of a character.
-
- arguments
- 1 code: character encoding
- 2 start: string address
- 3 s: target address of string
-
-
-# int regex_set_default_syntax(RegSyntaxType* syntax)
-
- Set default syntax.
-
- arguments
- 1 syntax: pointer to pattern syntax definition.
-
-
-# void regex_set_default_trans_table(UChar* table)
-
- Set default case transformation table.
-
- arguments
- 1 table: case transformation table
-
- (* this function will be obsoleted in future version)
-
-
-# int regex_end(void)
-
- The use of this library is finished.
-
- normal return: REG_NORMAL
-
-
-# const char* regex_version(void)
-
- Return version string. (ex. "1.8.6")
-
-// END
+++ /dev/null
-Oniguruma Regular Expressions 2003/07/04
-
-syntax: REG_SYNTAX_RUBY (default)
-
-
-1. Syntax elements
-
- \ escape
- | alternation
- (...) group
- [...] character class
-
-
-2. Characters
-
- \t horizontal tab (0x09)
- \v vertical tab (0x0B)
- \n newline (0x0A)
- \r return (0x0D)
- \b back space (0x08) (* in character class only)
- \f form feed (0x0C)
- \a bell (0x07)
- \e escape (0x1B)
- \nnn octal char
- \xHH hexadecimal char
- \x{7HHHHHHH} wide hexadecimal char
- \cx control char
- \C-x control char
- \M-x meta (x|0x80)
- \M-\C-x meta control char
-
-
-3. Character types
-
- . any character (except newline)
- \w word character (alphanumeric, "_" and multibyte char)
- \W non-word char
- \s whitespace char (\t, \n, \v, \f, \r, \x20)
- \S non-whitespace char
- \d digit char
- \D non-digit char
-
-
-4. Quantifier
-
- greedy
-
- ? 1 or 0 times
- * 0 or more times
- + 1 or more times
- {n,m} at least n but not more than m times
- {n,} at least n times
- {n} n times
-
- reluctant
-
- ?? 1 or 0 times
- *? 0 or more times
- +? 1 or more times
- {n,m}? at least n but not more than m times
- {n,}? at least n times
-
- possessive (greedy and does not backtrack after repeated)
-
- ?+ 1 or 0 times
- *+ 0 or more times
- ++ 1 or more times
-
-
-5. Anchors
-
- ^ beginning of the line
- $ end of the line
- \b word boundary
- \B not word boundary
- \A beginning of string
- \Z end of string, or before newline at the end
- \z end of string
- \G previous end-of-match position
-
-
-6. POSIX character class ([:xxxxx:], negate [:^xxxxx:])
-
- alnum alphabet or digit char
- alpha alphabet
- ascii code value: [0 - 127]
- blank \t, \x20
- cntrl
- digit 0-9
- graph
- lower
- print
- punct
- space \t, \n, \v, \f, \r, \x20
- upper
- xdigit 0-9, a-f, A-F
-
-
-7. Operators in character class
-
- [...] group (character class in character class)
- && intersection
- (lowest precedence operator in character class)
-
- ex. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]
-
-
-8. Extended expressions
-
- (?#...) comment
- (?imx-imx) option on/off
- i: ignore case
- m: multi-line (dot(.) match newline)
- x: extended form
- (?imx-imx:subexp) option on/off for subexp
- (?:subexp) not captured
- (?=subexp) look-ahead
- (?!subexp) negative look-ahead
- (?<=subexp) look-behind
- (?<!subexp) negative look-behind
-
- Subexp of look-behind must be fixed character length.
- But different character length is allowed in top level
- alternatives only.
- ex. (?<=a|bc) is OK. (?<=aaa(?:b|cd)) is not allowed.
-
- (?>subexp) don't backtrack
- (?<name>subexp) define named group
- (name can not include '>', ')', '\' and NUL character)
-
-
-9. Back reference
-
- \n back reference by group number (n >= 1)
- \k<name> back reference by group name
-
-
-10. Subexp call ("Tanaka Akira special")
-
- \g<name> call by group name
- \g<n> call by group number (only if 'n' is not defined as name)
-
-
------------------------------
-11. Original extensions
-
- + named group (?<name>...)
- + named backref \k<name>
- + subexp call \g<name>, \g<group-num>
-
-
-12. Lacked features compare with perl 5.8.0
-
- + [:word:]
- + \N{name}
- + \l,\u,\L,\U, \P, \X, \C
- + (?{code})
- + (??{code})
- + (?(condition)yes-pat|no-pat)
-
- + \Q...\E (* This is effective on REG_SYNTAX_PERL and REG_SYNTAX_JAVA)
-
-
-13. Syntax depend options
-
- + REG_SYNTAX_RUBY (default)
- (?m): dot(.) match newline
-
- + REG_SYNTAX_PERL, REG_SYNTAX_JAVA
- (?s): dot(.) match newline
- (?m): ^ match after newline, $ match before newline
-
-
-14. Differences with Japanized GNU regex(version 0.12) of Ruby
-
- + add look behind
- (?<=fixed-char-length-pattern), (?<!fixed-char-length-pattern)
- (in negative-look-behind, capture group isn't allowed,
- shy group(?:) is allowed.)
- + add possessive quantifier. ?+, *+, ++
- + add operations in character class. [], &&
- + add named group and subexp call.
- + octal or hexadecimal number sequence can be treated as
- a multibyte code char in char-class, if multibyte encoding is specified.
- (ex. [\xa1\xa2], [\xa1\xa7-\xa4\xa1])
- + effect range of isolated option is to next ')'.
- ex. (?:(?i)a|b) is interpreted as (?:(?i:a|b)), not (?:(?i:a)|b).
- + isolated option is not transparent to previous pattern.
- ex. a(?i)* is a syntax error pattern.
- + allowed incompleted left brace as an usual char.
- ex. /{/, /({)/, /a{2,3/ etc...
- + negative POSIX bracket [:^xxxx:] is supported.
- + POSIX bracket [:ascii:] is added.
- + repeat of look-ahead is not allowd.
- ex. /(?=a)*/, /(?!b){5}/
-
-
-14. Problems
-
- + Invalid first byte in UTF-8 is allowed.
- (which is the same as GNU regex of Ruby)
-
- /./u =~ "\xa3"
-
- Of course, although it is possible to validate,
- it will become later than now.
-
- + Zero-length match in infinite repeat stops the repeat,
- and captured group status isn't checked as stop condition.
-
- /()*\1/ =~ "" #=> match
- /(?:()|())*\1\2/ =~ "" #=> fail
-
- /(?:\1a|())*/ =~ "a" #=> match with ""
-
- + Ignore case option is not effect to an octal or hexadecimal
- numbered char, but it becomes effective if it appears in the char class.
- This doesn't have consistency, though they are the specifications
- which are the same as GNU regex of Ruby.
-
- /\x61/i.match("A") # => nil
- /[\x61]/i.match("A") # => match
-
-// END
--- /dev/null
+/**********************************************************************
+
+ onigcmpt200.h - Oniguruma (regular expression library)
+
+ Copyright (C) 2004 K.Kosako (kosako@sofnec.co.jp)
+
+**********************************************************************/
+#ifndef ONIGCMPT200_H
+#define ONIGCMPT200_H
+
+/* constants */
+#define REG_MAX_ERROR_MESSAGE_LEN ONIG_MAX_ERROR_MESSAGE_LEN
+
+#define RegCharEncoding OnigEncoding
+
+#define REG_ENCODING_ASCII ONIG_ENCODING_ASCII
+#define REG_ENCODING_ISO_8859_1 ONIG_ENCODING_ISO_8859_1
+#define REG_ENCODING_ISO_8859_15 ONIG_ENCODING_ISO_8859_15
+#define REG_ENCODING_UTF8 ONIG_ENCODING_UTF8
+#define REG_ENCODING_EUC_JP ONIG_ENCODING_EUC_JP
+#define REG_ENCODING_SJIS ONIG_ENCODING_SJIS
+#define REG_ENCODING_BIG5 ONIG_ENCODING_BIG5
+#define REG_ENCODING_UNDEF ONIG_ENCODING_UNDEF
+
+/* Don't use REGCODE_XXXX. (obsoleted) */
+#define REGCODE_UNDEF REG_ENCODING_UNDEF
+#define REGCODE_ASCII REG_ENCODING_ASCII
+#define REGCODE_UTF8 REG_ENCODING_UTF8
+#define REGCODE_EUCJP REG_ENCODING_EUC_JP
+#define REGCODE_SJIS REG_ENCODING_SJIS
+
+typedef unsigned char* RegTransTableType;
+#define RegOptionType OnigOptionType
+#define RegDistance OnigDistance
+
+#define REG_OPTION_DEFAULT ONIG_OPTION_DEFAULT
+
+/* options */
+#define REG_OPTION_NONE ONIG_OPTION_NONE
+#define REG_OPTION_SINGLELINE ONIG_OPTION_SINGLELINE
+#define REG_OPTION_MULTILINE ONIG_OPTION_MULTILINE
+#define REG_OPTION_IGNORECASE ONIG_OPTION_IGNORECASE
+#define REG_OPTION_EXTEND ONIG_OPTION_EXTEND
+#define REG_OPTION_FIND_LONGEST ONIG_OPTION_FIND_LONGEST
+#define REG_OPTION_FIND_NOT_EMPTY ONIG_OPTION_FIND_NOT_EMPTY
+#define REG_OPTION_NEGATE_SINGLELINE ONIG_OPTION_NEGATE_SINGLELINE
+#define REG_OPTION_DONT_CAPTURE_GROUP ONIG_OPTION_DONT_CAPTURE_GROUP
+#define REG_OPTION_CAPTURE_GROUP ONIG_OPTION_CAPTURE_GROUP
+#define REG_OPTION_NOTBOL ONIG_OPTION_NOTBOL
+#define REG_OPTION_NOTEOL ONIG_OPTION_NOTEOL
+#define REG_OPTION_POSIX_REGION ONIG_OPTION_POSIX_REGION
+
+#define REG_OPTION_ON ONIG_OPTION_ON
+#define REG_OPTION_OFF ONIG_OPTION_OFF
+#define IS_REG_OPTION_ON ONIG_IS_OPTION_ON
+
+/* syntax */
+#define RegSyntaxType OnigSyntaxType
+
+#define RegSyntaxPosixBasic OnigSyntaxPosixBasic
+#define RegSyntaxPosixExtended OnigSyntaxPosixExtended
+#define RegSyntaxEmacs OnigSyntaxEmacs
+#define RegSyntaxGrep OnigSyntaxGrep
+#define RegSyntaxGnuRegex OnigSyntaxGnuRegex
+#define RegSyntaxJava OnigSyntaxJava
+#define RegSyntaxPerl OnigSyntaxPerl
+#define RegSyntaxRuby OnigSyntaxRuby
+
+#define REG_SYNTAX_POSIX_BASIC ONIG_SYNTAX_POSIX_BASIC
+#define REG_SYNTAX_POSIX_EXTENDED ONIG_SYNTAX_POSIX_EXTENDED
+#define REG_SYNTAX_EMACS ONIG_SYNTAX_EMACS
+#define REG_SYNTAX_GREP ONIG_SYNTAX_GREP
+#define REG_SYNTAX_GNU_REGEX ONIG_SYNTAX_GNU_REGEX
+#define REG_SYNTAX_JAVA ONIG_SYNTAX_JAVA
+#define REG_SYNTAX_PERL ONIG_SYNTAX_PERL
+#define REG_SYNTAX_RUBY ONIG_SYNTAX_RUBY
+
+#define REG_SYNTAX_DEFAULT ONIG_SYNTAX_DEFAULT
+#define RegDefaultSyntax OnigDefaultSyntax
+
+/* syntax (operators) */
+#define REG_SYN_OP_VARIABLE_META_CHARACTERS \
+ ONIG_SYN_OP_VARIABLE_META_CHARACTERS
+#define REG_SYN_OP_DOT_ANYCHAR \
+ ONIG_SYN_OP_DOT_ANYCHAR
+#define REG_SYN_OP_ASTERISK_ZERO_INF \
+ ONIG_SYN_OP_ASTERISK_ZERO_INF
+#define REG_SYN_OP_ESC_ASTERISK_ZERO_INF \
+ ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF
+#define REG_SYN_OP_PLUS_ONE_INF \
+ ONIG_SYN_OP_PLUS_ONE_INF
+#define REG_SYN_OP_ESC_PLUS_ONE_INF \
+ ONIG_SYN_OP_ESC_PLUS_ONE_INF
+#define REG_SYN_OP_QMARK_ZERO_ONE \
+ ONIG_SYN_OP_QMARK_ZERO_ONE
+#define REG_SYN_OP_ESC_QMARK_ZERO_ONE \
+ ONIG_SYN_OP_ESC_QMARK_ZERO_ONE
+#define REG_SYN_OP_BRACE_INTERVAL \
+ ONIG_SYN_OP_BRACE_INTERVAL
+#define REG_SYN_OP_ESC_BRACE_INTERVAL \
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL
+#define REG_SYN_OP_VBAR_ALT \
+ ONIG_SYN_OP_VBAR_ALT
+#define REG_SYN_OP_ESC_VBAR_ALT \
+ ONIG_SYN_OP_ESC_VBAR_ALT
+#define REG_SYN_OP_LPAREN_SUBEXP \
+ ONIG_SYN_OP_LPAREN_SUBEXP
+#define REG_SYN_OP_ESC_LPAREN_SUBEXP \
+ ONIG_SYN_OP_ESC_LPAREN_SUBEXP
+#define REG_SYN_OP_ESC_AZ_BUF_ANCHOR \
+ ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR
+#define REG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR \
+ ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR
+#define REG_SYN_OP_DECIMAL_BACKREF \
+ ONIG_SYN_OP_DECIMAL_BACKREF
+#define REG_SYN_OP_BRACKET_CC \
+ ONIG_SYN_OP_BRACKET_CC
+#define REG_SYN_OP_ESC_W_WORD \
+ ONIG_SYN_OP_ESC_W_WORD
+#define REG_SYN_OP_ESC_LTGT_WORD_BEGIN_END \
+ ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END
+#define REG_SYN_OP_ESC_B_WORD_BOUND \
+ ONIG_SYN_OP_ESC_B_WORD_BOUND
+#define REG_SYN_OP_ESC_S_WHITE_SPACE \
+ ONIG_SYN_OP_ESC_S_WHITE_SPACE
+#define REG_SYN_OP_ESC_D_DIGIT \
+ ONIG_SYN_OP_ESC_D_DIGIT
+#define REG_SYN_OP_LINE_ANCHOR \
+ ONIG_SYN_OP_LINE_ANCHOR
+#define REG_SYN_OP_POSIX_BRACKET \
+ ONIG_SYN_OP_POSIX_BRACKET
+#define REG_SYN_OP_QMARK_NON_GREEDY \
+ ONIG_SYN_OP_QMARK_NON_GREEDY
+#define REG_SYN_OP_ESC_CONTROL_CHARS \
+ ONIG_SYN_OP_ESC_CONTROL_CHARS
+#define REG_SYN_OP_ESC_C_CONTROL \
+ ONIG_SYN_OP_ESC_C_CONTROL
+#define REG_SYN_OP_ESC_OCTAL3 \
+ ONIG_SYN_OP_ESC_OCTAL3
+#define REG_SYN_OP_ESC_X_HEX2 \
+ ONIG_SYN_OP_ESC_X_HEX2
+#define REG_SYN_OP_ESC_X_BRACE_HEX8 \
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8
+
+#define REG_SYN_OP2_ESC_CAPITAL_Q_QUOTE \
+ ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE
+#define REG_SYN_OP2_QMARK_GROUP_EFFECT \
+ ONIG_SYN_OP2_QMARK_GROUP_EFFECT
+#define REG_SYN_OP2_OPTION_PERL \
+ ONIG_SYN_OP2_OPTION_PERL
+#define REG_SYN_OP2_OPTION_RUBY \
+ ONIG_SYN_OP2_OPTION_RUBY
+#define REG_SYN_OP2_PLUS_POSSESSIVE_REPEAT \
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT
+#define REG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL \
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL
+#define REG_SYN_OP2_CCLASS_SET_OP \
+ ONIG_SYN_OP2_CCLASS_SET_OP
+#define REG_SYN_OP2_QMARK_LT_NAMED_GROUP \
+ ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP
+#define REG_SYN_OP2_ESC_K_NAMED_BACKREF \
+ ONIG_SYN_OP2_ESC_K_NAMED_BACKREF
+#define REG_SYN_OP2_ESC_G_SUBEXP_CALL \
+ ONIG_SYN_OP2_ESC_G_SUBEXP_CALL
+#define REG_SYN_OP2_ATMARK_CAPTURE_HISTORY \
+ ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY
+#define REG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL \
+ ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL
+#define REG_SYN_OP2_ESC_CAPITAL_M_BAR_META \
+ ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META
+#define REG_SYN_OP2_ESC_V_VTAB \
+ ONIG_SYN_OP2_ESC_V_VTAB
+#define REG_SYN_OP2_ESC_U_HEX4 \
+ ONIG_SYN_OP2_ESC_U_HEX4
+#define REG_SYN_OP2_ESC_GNU_BUF_ANCHOR \
+ ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR
+
+#define REG_SYN_CONTEXT_INDEP_ANCHORS \
+ ONIG_SYN_CONTEXT_INDEP_ANCHORS
+#define REG_SYN_CONTEXT_INDEP_REPEAT_OPS \
+ ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS
+#define REG_SYN_CONTEXT_INVALID_REPEAT_OPS \
+ ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS
+#define REG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP \
+ ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP
+#define REG_SYN_ALLOW_INVALID_INTERVAL \
+ ONIG_SYN_ALLOW_INVALID_INTERVAL
+#define REG_SYN_STRICT_CHECK_BACKREF \
+ ONIG_SYN_STRICT_CHECK_BACKREF
+#define REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND \
+ ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND
+#define REG_SYN_CAPTURE_ONLY_NAMED_GROUP \
+ ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP
+#define REG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME \
+ ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME
+
+#define REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC \
+ ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC
+#define REG_SYN_BACKSLASH_ESCAPE_IN_CC \
+ ONIG_SYN_BACKSLASH_ESCAPE_IN_CC
+#define REG_SYN_ALLOW_EMPTY_RANGE_IN_CC \
+ ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC
+#define REG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC \
+ ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC
+#define REG_SYN_WARN_CC_OP_NOT_ESCAPED \
+ ONIG_SYN_WARN_CC_OP_NOT_ESCAPED
+#define REG_SYN_WARN_REDUNDANT_NESTED_REPEAT \
+ ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT
+
+/* meta character specifiers (regex_set_meta_char()) */
+#define REG_META_CHAR_ESCAPE ONIG_META_CHAR_ESCAPE
+#define REG_META_CHAR_ANYCHAR ONIG_META_CHAR_ANYCHAR
+#define REG_META_CHAR_ANYTIME ONIG_META_CHAR_ANYTIME
+#define REG_META_CHAR_ZERO_OR_ONE_TIME ONIG_META_CHAR_ZERO_OR_ONE_TIME
+#define REG_META_CHAR_ONE_OR_MORE_TIME ONIG_META_CHAR_ONE_OR_MORE_TIME
+#define REG_META_CHAR_ANYCHAR_ANYTIME ONIG_META_CHAR_ANYCHAR_ANYTIME
+
+#define REG_INEFFECTIVE_META_CHAR ONIG_INEFFECTIVE_META_CHAR
+
+/* error codes */
+#define REG_IS_PATTERN_ERROR ONIG_IS_PATTERN_ERROR
+/* normal return */
+#define REG_NORMAL ONIG_NORMAL
+#define REG_MISMATCH ONIG_MISMATCH
+#define REG_NO_SUPPORT_CONFIG ONIG_NO_SUPPORT_CONFIG
+/* internal error */
+#define REGERR_MEMORY ONIGERR_MEMORY
+#define REGERR_MATCH_STACK_LIMIT_OVER ONIGERR_MATCH_STACK_LIMIT_OVER
+#define REGERR_TYPE_BUG ONIGERR_TYPE_BUG
+#define REGERR_PARSER_BUG ONIGERR_PARSER_BUG
+#define REGERR_STACK_BUG ONIGERR_STACK_BUG
+#define REGERR_UNDEFINED_BYTECODE ONIGERR_UNDEFINED_BYTECODE
+#define REGERR_UNEXPECTED_BYTECODE ONIGERR_UNEXPECTED_BYTECODE
+#define REGERR_DEFAULT_ENCODING_IS_NOT_SETTED \
+ ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED
+#define REGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR \
+ ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR
+/* general error */
+#define REGERR_INVALID_ARGUMENT ONIGERR_INVALID_ARGUMENT
+/* errors related to thread */
+#define REGERR_OVER_THREAD_PASS_LIMIT_COUNT \
+ ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT
+
+
+/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */
+#define REG_MAX_CAPTURE_HISTORY_GROUP ONIG_MAX_CAPTURE_HISTORY_GROUP
+#define REG_IS_CAPTURE_HISTORY_GROUP ONIG_IS_CAPTURE_HISTORY_GROUP
+
+#define REG_REGION_NOTPOS ONIG_REGION_NOTPOS
+
+#define RegRegion OnigRegion
+#define RegErrorInfo OnigErrorInfo
+#define RegRepeatRange OnigRepeatRange
+
+#define RegWarnFunc OnigWarnFunc
+#define regex_null_warn onig_null_warn
+#define REG_NULL_WARN ONIG_NULL_WARN
+
+/* regex_t state */
+#define REG_STATE_NORMAL ONIG_STATE_NORMAL
+#define REG_STATE_SEARCHING ONIG_STATE_SEARCHING
+#define REG_STATE_COMPILING ONIG_STATE_COMPILING
+#define REG_STATE_MODIFY ONIG_STATE_MODIFY
+
+#define REG_STATE ONIG_STATE
+
+/* Oniguruma Native API */
+#define regex_init onig_init
+#define regex_error_code_to_str onig_error_code_to_str
+#define regex_set_warn_func onig_set_warn_func
+#define regex_set_verb_warn_func onig_set_verb_warn_func
+#define regex_new onig_new
+#define regex_free onig_free
+#define regex_recompile onig_recompile
+#define regex_search onig_search
+#define regex_match onig_match
+#define regex_region_new onig_region_new
+#define regex_region_free onig_region_free
+#define regex_region_copy onig_region_copy
+#define regex_region_clear onig_region_clear
+#define regex_region_resize onig_region_resize
+#define regex_name_to_group_numbers onig_name_to_group_numbers
+#define regex_name_to_backref_number onig_name_to_backref_number
+#define regex_foreach_name onig_foreach_name
+#define regex_number_of_names onig_number_of_names
+#define regex_get_encoding onig_get_encoding
+#define regex_get_options onig_get_options
+#define regex_get_syntax onig_get_syntax
+#define regex_set_default_syntax onig_set_default_syntax
+#define regex_copy_syntax onig_copy_syntax
+#define regex_set_meta_char onig_set_meta_char
+#define regex_end onig_end
+#define regex_version onig_version
+
+/* encoding API */
+#define enc_get_prev_char_head onigenc_get_prev_char_head
+#define enc_get_left_adjust_char_head onigenc_get_left_adjust_char_head
+#define enc_get_right_adjust_char_head onigenc_get_right_adjust_char_head
+/* obsoleted API */
+#define regex_get_prev_char_head onigenc_get_prev_char_head
+#define regex_get_left_adjust_char_head onigenc_get_left_adjust_char_head
+#define regex_get_right_adjust_char_head onigenc_get_right_adjust_char_head
+
+#endif /* ONIGCMPT200_H */
--- /dev/null
+/**********************************************************************
+
+ oniggnu.h - Oniguruma (regular expression library)
+
+ Copyright (C) 2004 K.Kosako (kosako@sofnec.co.jp)
+
+**********************************************************************/
+#ifndef ONIGGNU_H
+#define ONIGGNU_H
+
+#include "oniguruma.h"
+
+#define MBCTYPE_ASCII 0
+#define MBCTYPE_EUC 1
+#define MBCTYPE_SJIS 2
+#define MBCTYPE_UTF8 3
+
+/* GNU regex options */
+#ifndef RE_NREGS
+#define RE_NREGS ONIG_NREGION
+#endif
+#define RE_OPTION_IGNORECASE ONIG_OPTION_IGNORECASE
+#define RE_OPTION_EXTENDED ONIG_OPTION_EXTEND
+#define RE_OPTION_MULTILINE ONIG_OPTION_MULTILINE
+#define RE_OPTION_SINGLELINE ONIG_OPTION_SINGLELINE
+#define RE_OPTION_LONGEST ONIG_OPTION_FIND_LONGEST
+#define RE_OPTION_POSIXLINE (RE_OPTION_MULTILINE|RE_OPTION_SINGLELINE)
+
+#ifdef RUBY_PLATFORM
+#define re_mbcinit ruby_re_mbcinit
+#define re_compile_pattern ruby_re_compile_pattern
+#define re_recompile_pattern ruby_re_recompile_pattern
+#define re_free_pattern ruby_re_free_pattern
+#define re_adjust_startpos ruby_re_adjust_startpos
+#define re_search ruby_re_search
+#define re_match ruby_re_match
+#define re_set_casetable ruby_re_set_casetable
+#define re_copy_registers ruby_re_copy_registers
+#define re_free_registers ruby_re_free_registers
+#define register_info_type ruby_register_info_type
+#define re_error_code_to_str ruby_error_code_to_str
+
+#define ruby_error_code_to_str onig_error_code_to_str
+#define ruby_re_copy_registers onig_region_copy
+#else
+#define re_error_code_to_str onig_error_code_to_str
+#define re_copy_registers onig_region_copy
+#endif
+
+#ifdef ONIG_RUBY_M17N
+ONIG_EXTERN
+void re_mbcinit P_((OnigEncoding));
+#else
+ONIG_EXTERN
+void re_mbcinit P_((int));
+#endif
+
+ONIG_EXTERN
+int re_compile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));
+ONIG_EXTERN
+int re_recompile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));
+ONIG_EXTERN
+void re_free_pattern P_((struct re_pattern_buffer*));
+ONIG_EXTERN
+int re_adjust_startpos P_((struct re_pattern_buffer*, const char*, int, int, int));
+ONIG_EXTERN
+int re_search P_((struct re_pattern_buffer*, const char*, int, int, int, struct re_registers*));
+ONIG_EXTERN
+int re_match P_((struct re_pattern_buffer*, const char *, int, int, struct re_registers*));
+ONIG_EXTERN
+void re_set_casetable P_((const char*));
+ONIG_EXTERN
+void re_free_registers P_((struct re_registers*));
+ONIG_EXTERN
+int re_alloc_pattern P_((struct re_pattern_buffer**)); /* added */
+
+#endif /* ONIGGNU_H */
onigposix.h - Oniguruma (regular expression library)
- Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#ifndef ONIGPOSIX_H
#define REG_NEWLINE (1<<1)
#define REG_NOTBOL (1<<2)
#define REG_NOTEOL (1<<3)
-#define REG_EXTENDED (1<<4) /* if not setted, Basic Regular Expression */
+#define REG_EXTENDED (1<<4) /* if not setted, Basic Onigular Expression */
#define REG_NOSUB (1<<5)
/* POSIX error codes */
#define REG_EONIG_THREAD 17
/* character encodings (for reg_set_encoding()) */
-/* These value must be same with MBCTYPE_XXXX in oniguruma.h.*/
-#define REG_ENCODING_ASCII 0
-#define REG_ENCODING_EUC_JP 1
-#define REG_ENCODING_SJIS 2
-#define REG_ENCODING_UTF8 3
+#define REG_POSIX_ENCODING_ASCII 0
+#define REG_POSIX_ENCODING_EUC_JP 1
+#define REG_POSIX_ENCODING_SJIS 2
+#define REG_POSIX_ENCODING_UTF8 3
#include <stdlib.h>
#ifndef P_
-#ifdef __STDC__
+#if defined(__STDC__) || defined(_WIN32)
# define P_(args) args
#else
# define P_(args) ()
#endif
#endif
-#ifndef REG_EXTERN
+#ifndef ONIG_EXTERN
#if defined(_WIN32) && !defined(__CYGWIN__)
#if defined(EXPORT) || defined(RUBY_EXPORT)
-#define REG_EXTERN extern __declspec(dllexport)
-#elif defined(IMPORT)
-#define REG_EXTERN extern __declspec(dllimport)
+#define ONIG_EXTERN extern __declspec(dllexport)
+#else
+#define ONIG_EXTERN extern __declspec(dllimport)
#endif
#endif
#endif
-#ifndef REG_EXTERN
-#define REG_EXTERN extern
+#ifndef ONIG_EXTERN
+#define ONIG_EXTERN extern
#endif
#ifndef ONIGURUMA_H
-typedef unsigned int RegOptionType;
+typedef unsigned int OnigOptionType;
/* syntax */
typedef struct {
unsigned int op;
unsigned int op2;
unsigned int behavior;
- RegOptionType options; /* default option */
-} RegSyntaxType;
-
-REG_EXTERN RegSyntaxType RegSyntaxPosixBasic;
-REG_EXTERN RegSyntaxType RegSyntaxPosixExtended;
-REG_EXTERN RegSyntaxType RegSyntaxEmacs;
-REG_EXTERN RegSyntaxType RegSyntaxGrep;
-REG_EXTERN RegSyntaxType RegSyntaxGnuRegex;
-REG_EXTERN RegSyntaxType RegSyntaxJava;
-REG_EXTERN RegSyntaxType RegSyntaxPerl;
-REG_EXTERN RegSyntaxType RegSyntaxRuby;
-
-/* predefined syntaxes (see regcomp.c) */
-#define REG_SYNTAX_POSIX_BASIC (&RegSyntaxPosixBasic)
-#define REG_SYNTAX_POSIX_EXTENDED (&RegSyntaxPosixExtended)
-#define REG_SYNTAX_EMACS (&RegSyntaxEmacs)
-#define REG_SYNTAX_GREP (&RegSyntaxGrep)
-#define REG_SYNTAX_GNU_REGEX (&RegSyntaxGnuRegex)
-#define REG_SYNTAX_JAVA (&RegSyntaxJava)
-#define REG_SYNTAX_PERL (&RegSyntaxPerl)
-#define REG_SYNTAX_RUBY (&RegSyntaxRuby)
+ OnigOptionType options; /* default option */
+} OnigSyntaxType;
+
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxJava;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;
+
+/* predefined syntaxes (see regparse.c) */
+#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic)
+#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended)
+#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs)
+#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep)
+#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex)
+#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava)
+#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl)
+#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby)
/* default syntax */
-#define REG_SYNTAX_DEFAULT RegDefaultSyntax
+#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax
-REG_EXTERN RegSyntaxType* RegDefaultSyntax;
+ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax;
-REG_EXTERN int regex_set_default_syntax P_((RegSyntaxType* syntax));
+ONIG_EXTERN int onig_set_default_syntax P_((OnigSyntaxType* syntax));
+ONIG_EXTERN void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from));
#endif /* ONIGURUMA_H */
-REG_EXTERN int regcomp P_((regex_t* reg, const char* pat, int options));
-REG_EXTERN int regexec P_((regex_t* reg, const char* str, size_t nmatch, regmatch_t* matches, int options));
-REG_EXTERN void regfree P_((regex_t* reg));
-REG_EXTERN size_t regerror P_((int code, const regex_t* reg, char* buf, size_t size));
+ONIG_EXTERN int regcomp P_((regex_t* reg, const char* pat, int options));
+ONIG_EXTERN int regexec P_((regex_t* reg, const char* str, size_t nmatch, regmatch_t* matches, int options));
+ONIG_EXTERN void regfree P_((regex_t* reg));
+ONIG_EXTERN size_t regerror P_((int code, const regex_t* reg, char* buf, size_t size));
/* extended API */
-REG_EXTERN void reg_set_encoding P_((int enc));
-REG_EXTERN int reg_name_to_group_numbers P_((regex_t* reg, unsigned char* name, unsigned char* name_end, int** nums));
-REG_EXTERN int reg_foreach_name P_((regex_t* reg, int (*func)(unsigned char*,int,int*,void*), void* arg));
+ONIG_EXTERN void reg_set_encoding P_((int enc));
+ONIG_EXTERN int reg_name_to_group_numbers P_((regex_t* reg, unsigned char* name, unsigned char* name_end, int** nums));
+ONIG_EXTERN int reg_foreach_name P_((regex_t* reg, int (*func)(unsigned char*,unsigned char*,int,int*,regex_t*,void*), void* arg));
+ONIG_EXTERN int reg_number_of_names P_((regex_t* reg));
#endif /* ONIGPOSIX_H */
oniguruma.h - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#ifndef ONIGURUMA_H
#include "php_compat.h"
#define ONIGURUMA
-#define ONIGURUMA_VERSION_MAJOR 1
-#define ONIGURUMA_VERSION_MINOR 9
-#define ONIGURUMA_VERSION_TEENY 1
-
-/* config parameters */
-#ifndef RE_NREGS
-#define RE_NREGS 10
-#endif
-#define REG_NREGION RE_NREGS
-#define REG_MAX_BACKREF_NUM 1000
-#define REG_MAX_REPEAT_NUM 100000
-#define REG_MAX_MULTI_BYTE_RANGES_NUM 1000
-/* constants */
-#define REG_MAX_ERROR_MESSAGE_LEN 90
+#define ONIGURUMA_VERSION_MAJOR 2
+#define ONIGURUMA_VERSION_MINOR 2
+#define ONIGURUMA_VERSION_TEENY 2
#ifndef P_
-#ifdef __STDC__
+#if defined(__STDC__) || defined(_WIN32)
# define P_(args) args
#else
# define P_(args) ()
#endif
#endif
-#ifndef REG_EXTERN
+#ifndef ONIG_EXTERN
#if defined(_WIN32) && !defined(__CYGWIN__)
#if defined(EXPORT) || defined(RUBY_EXPORT)
-#define REG_EXTERN extern __declspec(dllexport)
-#elif defined(IMPORT)
-#define REG_EXTERN extern __declspec(dllimport)
+#define ONIG_EXTERN extern __declspec(dllexport)
+#else
+#define ONIG_EXTERN extern __declspec(dllimport)
#endif
#endif
#endif
-#ifndef REG_EXTERN
-#define REG_EXTERN extern
+#ifndef ONIG_EXTERN
+#define ONIG_EXTERN extern
#endif
-#define REG_CHAR_TABLE_SIZE 256
+/* PART: character encoding */
+
+typedef unsigned char UChar;
+typedef unsigned long OnigCodePoint;
+typedef unsigned int OnigDistance;
+
+#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0)
+
+typedef struct {
+ OnigCodePoint from;
+ OnigCodePoint to;
+} OnigCodePointRange;
+
+#define ONIGENC_FOLD_MATCH_MAX_TARGET_NUM_SIZE 16
+typedef struct {
+ int target_num;
+ int target_byte_len[ONIGENC_FOLD_MATCH_MAX_TARGET_NUM_SIZE];
+ UChar* target_str[ONIGENC_FOLD_MATCH_MAX_TARGET_NUM_SIZE];
+} OnigEncFoldMatchInfo;
-#define REGCODE_UNDEF ((RegCharEncoding )0)
#if defined(RUBY_PLATFORM) && defined(M17N_H)
-#define REG_RUBY_M17N
-typedef m17n_encoding* RegCharEncoding;
-#define REGCODE_DEFAULT REGCODE_UNDEF
+
+#define ONIG_RUBY_M17N
+typedef m17n_encoding* OnigEncoding;
+
#else
-typedef const char* RegCharEncoding;
-#define MBCTYPE_ASCII 0
-#define MBCTYPE_EUC 1
-#define MBCTYPE_SJIS 2
-#define MBCTYPE_UTF8 3
-
-#define REGCODE_ASCII REG_MBLEN_TABLE[MBCTYPE_ASCII]
-#define REGCODE_UTF8 REG_MBLEN_TABLE[MBCTYPE_UTF8]
-#define REGCODE_EUCJP REG_MBLEN_TABLE[MBCTYPE_EUC]
-#define REGCODE_SJIS REG_MBLEN_TABLE[MBCTYPE_SJIS]
-#define REGCODE_DEFAULT REGCODE_ASCII
-
-REG_EXTERN const char REG_MBLEN_TABLE[][REG_CHAR_TABLE_SIZE];
+
+typedef struct {
+ const char len_table[256];
+ const char* name;
+ int max_enc_len;
+ int is_fold_match;
+ int ctype_support_level; /* sb-only/full */
+ int is_continuous_sb_mb; /* code point is continuous from sb to mb */
+ OnigCodePoint (*mbc_to_code)(UChar* p, UChar* end);
+ int (*code_to_mbclen)(OnigCodePoint code);
+ int (*code_to_mbc)(OnigCodePoint code, UChar *buf);
+ int (*mbc_to_lower)(UChar* p, UChar* lower);
+ int (*mbc_is_case_ambig)(UChar* p);
+ int (*code_is_ctype)(OnigCodePoint code, unsigned int ctype);
+ int (*get_ctype_code_range)(int ctype, int* nsb, int* nmb, OnigCodePointRange* sbr[], OnigCodePointRange* mbr[]);
+ UChar* (*left_adjust_char_head)(UChar* start, UChar* s);
+ int (*is_allowed_reverse_match)(UChar* p, UChar* e);
+ int (*get_all_fold_match_code)(OnigCodePoint** codes);
+ int (*get_fold_match_info)(UChar* p, UChar* end, OnigEncFoldMatchInfo** info);
+} OnigEncodingType;
+
+typedef OnigEncodingType* OnigEncoding;
+
+ONIG_EXTERN OnigEncodingType OnigEncodingASCII;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_1;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_2;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_3;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_4;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_5;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_6;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_7;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_8;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_9;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_10;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_11;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_13;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_14;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_15;
+ONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_16;
+ONIG_EXTERN OnigEncodingType OnigEncodingUTF8;
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_JP;
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_TW;
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_KR;
+ONIG_EXTERN OnigEncodingType OnigEncodingEUC_CN;
+ONIG_EXTERN OnigEncodingType OnigEncodingSJIS;
+ONIG_EXTERN OnigEncodingType OnigEncodingKOI8;
+ONIG_EXTERN OnigEncodingType OnigEncodingKOI8_R;
+ONIG_EXTERN OnigEncodingType OnigEncodingBIG5;
+
+#define ONIG_ENCODING_ASCII (&OnigEncodingASCII)
+#define ONIG_ENCODING_ISO_8859_1 (&OnigEncodingISO_8859_1)
+#define ONIG_ENCODING_ISO_8859_2 (&OnigEncodingISO_8859_2)
+#define ONIG_ENCODING_ISO_8859_3 (&OnigEncodingISO_8859_3)
+#define ONIG_ENCODING_ISO_8859_4 (&OnigEncodingISO_8859_4)
+#define ONIG_ENCODING_ISO_8859_5 (&OnigEncodingISO_8859_5)
+#define ONIG_ENCODING_ISO_8859_6 (&OnigEncodingISO_8859_6)
+#define ONIG_ENCODING_ISO_8859_7 (&OnigEncodingISO_8859_7)
+#define ONIG_ENCODING_ISO_8859_8 (&OnigEncodingISO_8859_8)
+#define ONIG_ENCODING_ISO_8859_9 (&OnigEncodingISO_8859_9)
+#define ONIG_ENCODING_ISO_8859_10 (&OnigEncodingISO_8859_10)
+#define ONIG_ENCODING_ISO_8859_11 (&OnigEncodingISO_8859_11)
+#define ONIG_ENCODING_ISO_8859_13 (&OnigEncodingISO_8859_13)
+#define ONIG_ENCODING_ISO_8859_14 (&OnigEncodingISO_8859_14)
+#define ONIG_ENCODING_ISO_8859_15 (&OnigEncodingISO_8859_15)
+#define ONIG_ENCODING_ISO_8859_16 (&OnigEncodingISO_8859_16)
+#define ONIG_ENCODING_UTF8 (&OnigEncodingUTF8)
+#define ONIG_ENCODING_EUC_JP (&OnigEncodingEUC_JP)
+#define ONIG_ENCODING_EUC_TW (&OnigEncodingEUC_TW)
+#define ONIG_ENCODING_EUC_KR (&OnigEncodingEUC_KR)
+#define ONIG_ENCODING_EUC_CN (&OnigEncodingEUC_CN)
+#define ONIG_ENCODING_SJIS (&OnigEncodingSJIS)
+#define ONIG_ENCODING_KOI8 (&OnigEncodingKOI8)
+#define ONIG_ENCODING_KOI8_R (&OnigEncodingKOI8_R)
+#define ONIG_ENCODING_BIG5 (&OnigEncodingBIG5)
+
#endif /* else RUBY && M17N */
-REG_EXTERN RegCharEncoding RegDefaultCharEncoding;
+#define ONIG_ENCODING_UNDEF ((OnigEncoding )0)
+
+
+/* work size */
+#define ONIGENC_CODE_TO_MBC_MAXLEN 7
+#define ONIGENC_MBC_TO_LOWER_MAXLEN ONIGENC_CODE_TO_MBC_MAXLEN
+
+/* character types */
+#define ONIGENC_CTYPE_ALPHA (1<< 0)
+#define ONIGENC_CTYPE_BLANK (1<< 1)
+#define ONIGENC_CTYPE_CNTRL (1<< 2)
+#define ONIGENC_CTYPE_DIGIT (1<< 3)
+#define ONIGENC_CTYPE_GRAPH (1<< 4)
+#define ONIGENC_CTYPE_LOWER (1<< 5)
+#define ONIGENC_CTYPE_PRINT (1<< 6)
+#define ONIGENC_CTYPE_PUNCT (1<< 7)
+#define ONIGENC_CTYPE_SPACE (1<< 8)
+#define ONIGENC_CTYPE_UPPER (1<< 9)
+#define ONIGENC_CTYPE_XDIGIT (1<<10)
+#define ONIGENC_CTYPE_WORD (1<<11)
+#define ONIGENC_CTYPE_ASCII (1<<12)
+#define ONIGENC_CTYPE_ALNUM (ONIGENC_CTYPE_ALPHA | ONIGENC_CTYPE_DIGIT)
+
+/* ctype support level */
+#define ONIGENC_CTYPE_SUPPORT_LEVEL_SB 0
+#define ONIGENC_CTYPE_SUPPORT_LEVEL_FULL 1
+
+
+#define enc_len(enc,byte) ONIGENC_MBC_LEN_BY_HEAD(enc,byte)
+
+#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF)
+#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1)
+#define ONIGENC_IS_MBC_HEAD(enc,byte) (ONIGENC_MBC_LEN_BY_HEAD(enc,byte) != 1)
+#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128)
+#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128)
+#define ONIGENC_IS_CODE_SB_WORD(enc,code) \
+ (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_WORD(enc,code))
+#define ONIGENC_IS_MBC_WORD(enc,s,end) \
+ ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end))
+
+
+#ifdef ONIG_RUBY_M17N
+
+#include <ctype.h> /* for isblank(), isgraph() */
+
+#define ONIGENC_MBC_TO_LOWER(enc,p,buf) onigenc_mbc_to_lower(enc,p,buf)
+#define ONIGENC_IS_MBC_CASE_AMBIG(enc,p) onigenc_mbc_is_case_ambig(enc,p)
+
+#define ONIGENC_IS_FOLD_MATCH(enc) FALSE
+#define ONIGENC_IS_CONTINUOUS_SB_MB(enc) FALSE
+#define ONIGENC_CTYPE_SUPPORT_LEVEL(enc) ONIGENC_CTYPE_SUPPORT_LEVEL_SB
+#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \
+ onigenc_is_allowed_reverse_match(enc, s, end)
+#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \
+ onigenc_get_left_adjust_char_head(enc, start, s)
+#define ONIGENC_GET_ALL_FOLD_MATCH_CODE(enc,codes) 0
+#define ONIGENC_GET_FOLD_MATCH_INFO(enc,p,end,info) ONIG_NO_SUPPORT_CONFIG
+#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,nsb,nmb,sbr,mbr) \
+ ONIG_NO_SUPPORT_CONFIG
+#define ONIGENC_MBC_LEN_BY_HEAD(enc,b) m17n_mbclen(enc,(int )b)
+#define ONIGENC_MBC_MAXLEN(enc) m17n_mbmaxlen(enc)
+#define ONIGENC_MBC_MAXLEN_DIST(enc) \
+ (ONIGENC_MBC_MAXLEN(enc) > 0 ? ONIGENC_MBC_MAXLEN(enc) \
+ : ONIG_INFINITE_DISTANCE)
+#define ONIGENC_MBC_TO_CODE(enc,p,e) m17n_codepoint((enc),(p),(e))
+#define ONIGENC_CODE_TO_MBCLEN(enc,code) m17n_codelen((enc),(code))
+#define ONIGENC_CODE_TO_MBC(enc,code,buf) onigenc_code_to_mbc(enc, code, buf)
+
+#if 0
+#define ONIGENC_STEP_BACK(enc,start,s,n) /* !! not supported !! */
+#endif
+
+#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) \
+ onigenc_is_code_ctype(enc,code,ctype)
-#if defined(RUBY_PLATFORM) && !defined(M17N_H)
-#undef ismbchar
-#define ismbchar(c) (mbclen((c)) != 1)
-#define mbclen(c) RegDefaultCharEncoding[(unsigned char )(c)]
+#ifdef isblank
+# define ONIGENC_IS_CODE_BLANK(enc,code) isblank((int )code)
+#else
+# define ONIGENC_IS_CODE_BLANK(enc,code) ((code) == ' ' || (code) == '\t')
+#endif
+#ifdef isgraph
+# define ONIGENC_IS_CODE_GRAPH(enc,code) isgraph((int )code)
+#else
+# define ONIGENC_IS_CODE_GRAPH(enc,code) \
+ (isprint((int )code) && !isspace((int )code))
#endif
-typedef unsigned int RegOptionType;
-typedef unsigned char* RegTransTableType;
-typedef unsigned int RegDistance;
-typedef unsigned char UChar;
+#define ONIGENC_IS_CODE_PRINT(enc,code) m17n_isprint(enc,code)
+#define ONIGENC_IS_CODE_ALNUM(enc,code) m17n_isalnum(enc,code)
+#define ONIGENC_IS_CODE_ALPHA(enc,code) m17n_isalpha(enc,code)
+#define ONIGENC_IS_CODE_LOWER(enc,code) m17n_islower(enc,code)
+#define ONIGENC_IS_CODE_UPPER(enc,code) m17n_isupper(enc,code)
+#define ONIGENC_IS_CODE_CNTRL(enc,code) m17n_iscntrl(enc,code)
+#define ONIGENC_IS_CODE_PUNCT(enc,code) m17n_ispunct(enc,code)
+#define ONIGENC_IS_CODE_SPACE(enc,code) m17n_isspace(enc,code)
+#define ONIGENC_IS_CODE_DIGIT(enc,code) m17n_isdigit(enc,code)
+#define ONIGENC_IS_CODE_XDIGIT(enc,code) m17n_isxdigit(enc,code)
+#define ONIGENC_IS_CODE_WORD(enc,code) m17n_iswchar(enc,code)
+
+ONIG_EXTERN
+int onigenc_is_code_ctype P_((OnigEncoding enc, OnigCodePoint code, int ctype));
+ONIG_EXTERN
+int onigenc_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));
+ONIG_EXTERN
+int onigenc_mbc_to_lower P_((OnigEncoding enc, UChar* p, UChar* buf));
+ONIG_EXTERN
+int onigenc_mbc_is_case_ambig P_((OnigEncoding enc, UChar* p));
+ONIG_EXTERN
+int onigenc_is_allowed_reverse_match P_((OnigEncoding enc, UChar* s, UChar* end));
+
+#else /* ONIG_RUBY_M17N */
+
+#define ONIGENC_NAME(enc) ((enc)->name)
+
+#define ONIGENC_MBC_TO_LOWER(enc,p,buf) (enc)->mbc_to_lower(p,buf)
+#define ONIGENC_IS_MBC_CASE_AMBIG(enc,p) (enc)->mbc_is_case_ambig(p)
+
+#define ONIGENC_IS_FOLD_MATCH(enc) ((enc)->is_fold_match)
+#define ONIGENC_IS_CONTINUOUS_SB_MB(enc) ((enc)->is_continuous_sb_mb)
+#define ONIGENC_CTYPE_SUPPORT_LEVEL(enc) ((enc)->ctype_support_level)
+#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \
+ (enc)->is_allowed_reverse_match(s,end)
+#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \
+ (enc)->left_adjust_char_head(start, s)
+#define ONIGENC_GET_ALL_FOLD_MATCH_CODE(enc,codes) \
+ (enc)->get_all_fold_match_code(codes)
+#define ONIGENC_GET_FOLD_MATCH_INFO(enc,p,end,info) \
+ (enc)->get_fold_match_info(p,end,info)
+#define ONIGENC_STEP_BACK(enc,start,s,n) \
+ onigenc_step_back((enc),(start),(s),(n))
+
+#define ONIGENC_MBC_LEN_BY_HEAD(enc,byte) ((enc)->len_table[(int )(byte)])
+#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len)
+#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc)
+#define ONIGENC_MBC_TO_CODE(enc,p,e) (enc)->mbc_to_code((p),(e))
+#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code)
+#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf)
+
+#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->code_is_ctype(code,ctype)
+
+#define ONIGENC_IS_CODE_GRAPH(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH)
+#define ONIGENC_IS_CODE_PRINT(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT)
+#define ONIGENC_IS_CODE_ALNUM(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM)
+#define ONIGENC_IS_CODE_ALPHA(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA)
+#define ONIGENC_IS_CODE_LOWER(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER)
+#define ONIGENC_IS_CODE_UPPER(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER)
+#define ONIGENC_IS_CODE_CNTRL(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL)
+#define ONIGENC_IS_CODE_PUNCT(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT)
+#define ONIGENC_IS_CODE_SPACE(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE)
+#define ONIGENC_IS_CODE_BLANK(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK)
+#define ONIGENC_IS_CODE_DIGIT(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT)
+#define ONIGENC_IS_CODE_XDIGIT(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT)
+#define ONIGENC_IS_CODE_WORD(enc,code) \
+ ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD)
+
+#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,nsb,nmb,sbr,mbr) \
+ (enc)->get_ctype_code_range(ctype,nsb,nmb,sbr,mbr)
+
+ONIG_EXTERN
+UChar* onigenc_step_back P_((OnigEncoding enc, UChar* start, UChar* s, int n));
+
+#endif /* is not ONIG_RUBY_M17N */
+
+
+/* encoding API */
+ONIG_EXTERN
+int onigenc_init P_(());
+ONIG_EXTERN
+int onigenc_set_default_encoding P_((OnigEncoding enc));
+ONIG_EXTERN
+OnigEncoding onigenc_get_default_encoding P_(());
+ONIG_EXTERN
+void onigenc_set_default_caseconv_table P_((UChar* table));
+ONIG_EXTERN
+UChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, UChar* start, UChar* s, UChar** prev));
+ONIG_EXTERN
+UChar* onigenc_get_prev_char_head P_((OnigEncoding enc, UChar* start, UChar* s));
+ONIG_EXTERN
+UChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, UChar* start, UChar* s));
+ONIG_EXTERN
+UChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, UChar* start, UChar* s));
+
+
+
+/* PART: regular expression */
+
+/* config parameters */
+#define ONIG_NREGION 10
+#define ONIG_MAX_BACKREF_NUM 1000
+#define ONIG_MAX_REPEAT_NUM 100000
+#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 1000
+/* constants */
+#define ONIG_MAX_ERROR_MESSAGE_LEN 90
+
+#if defined(RUBY_PLATFORM) && !defined(ONIG_RUBY_M17N)
+ONIG_EXTERN OnigEncoding OnigEncDefaultCharEncoding;
+#undef ismbchar
+#define ismbchar(c) (mbclen((c)) != 1)
+#define mbclen(c) (OnigEncDefaultCharEncoding->len_table[(unsigned char )(c)])
+#endif
-#define REG_OPTION_DEFAULT REG_OPTION_NONE
+typedef unsigned int OnigOptionType;
-/* GNU regex options */
-#define RE_OPTION_IGNORECASE (1L)
-#define RE_OPTION_EXTENDED (RE_OPTION_IGNORECASE << 1)
-#define RE_OPTION_MULTILINE (RE_OPTION_EXTENDED << 1)
-#define RE_OPTION_SINGLELINE (RE_OPTION_MULTILINE << 1)
-#define RE_OPTION_POSIXLINE (RE_OPTION_MULTILINE|RE_OPTION_SINGLELINE)
-#define RE_OPTION_LONGEST (RE_OPTION_SINGLELINE << 1)
+#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE
/* options */
-#define REG_OPTION_NONE 0
-#define REG_OPTION_SINGLELINE RE_OPTION_SINGLELINE
-#define REG_OPTION_MULTILINE RE_OPTION_MULTILINE
-#define REG_OPTION_IGNORECASE RE_OPTION_IGNORECASE
-#define REG_OPTION_EXTEND RE_OPTION_EXTENDED
-#define REG_OPTION_FIND_LONGEST RE_OPTION_LONGEST
-#define REG_OPTION_FIND_NOT_EMPTY (REG_OPTION_FIND_LONGEST << 1)
-#define REG_OPTION_NEGATE_SINGLELINE (REG_OPTION_FIND_NOT_EMPTY << 1)
-#define REG_OPTION_CAPTURE_ONLY_NAMED_GROUP (REG_OPTION_NEGATE_SINGLELINE << 1)
+#define ONIG_OPTION_NONE 0
+#define ONIG_OPTION_IGNORECASE 1L
+#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1)
+#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1)
+#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1)
+#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1)
+#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1)
+#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1)
+#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1)
+#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1)
/* options (search time) */
-#define REG_OPTION_NOTBOL (REG_OPTION_CAPTURE_ONLY_NAMED_GROUP << 1)
-#define REG_OPTION_NOTEOL (REG_OPTION_NOTBOL << 1)
-#define REG_OPTION_POSIX_REGION (REG_OPTION_NOTEOL << 1)
+#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1)
+#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1)
+#define ONIG_OPTION_POSIX_REGION (ONIG_OPTION_NOTEOL << 1)
-#define REG_OPTION_ON(options,regopt) ((options) |= (regopt))
-#define REG_OPTION_OFF(options,regopt) ((options) &= ~(regopt))
-#define IS_REG_OPTION_ON(options,option) ((options) & (option))
+#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt))
+#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt))
+#define ONIG_IS_OPTION_ON(options,option) ((options) & (option))
/* syntax */
typedef struct {
unsigned int op;
unsigned int op2;
unsigned int behavior;
- RegOptionType options; /* default option */
-} RegSyntaxType;
-
-REG_EXTERN RegSyntaxType RegSyntaxPosixBasic;
-REG_EXTERN RegSyntaxType RegSyntaxPosixExtended;
-REG_EXTERN RegSyntaxType RegSyntaxEmacs;
-REG_EXTERN RegSyntaxType RegSyntaxGrep;
-REG_EXTERN RegSyntaxType RegSyntaxGnuRegex;
-REG_EXTERN RegSyntaxType RegSyntaxJava;
-REG_EXTERN RegSyntaxType RegSyntaxPerl;
-REG_EXTERN RegSyntaxType RegSyntaxRuby;
-
-/* predefined syntaxes (see regcomp.c) */
-#define REG_SYNTAX_POSIX_BASIC (&RegSyntaxPosixBasic)
-#define REG_SYNTAX_POSIX_EXTENDED (&RegSyntaxPosixExtended)
-#define REG_SYNTAX_EMACS (&RegSyntaxEmacs)
-#define REG_SYNTAX_GREP (&RegSyntaxGrep)
-#define REG_SYNTAX_GNU_REGEX (&RegSyntaxGnuRegex)
-#define REG_SYNTAX_JAVA (&RegSyntaxJava)
-#define REG_SYNTAX_PERL (&RegSyntaxPerl)
-#define REG_SYNTAX_RUBY (&RegSyntaxRuby)
+ OnigOptionType options; /* default option */
+} OnigSyntaxType;
+
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxJava;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;
+ONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;
+
+/* predefined syntaxes (see regparse.c) */
+#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic)
+#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended)
+#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs)
+#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep)
+#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex)
+#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava)
+#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl)
+#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby)
/* default syntax */
-#define REG_SYNTAX_DEFAULT RegDefaultSyntax
-
-REG_EXTERN RegSyntaxType* RegDefaultSyntax;
+ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax;
+#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax
/* syntax (operators) */
-#define REG_SYN_OP_ANYCHAR 1 /* . */
-#define REG_SYN_OP_0INF (1<<1) /* * */
-#define REG_SYN_OP_ESC_0INF (1<<2)
-#define REG_SYN_OP_1INF (1<<3) /* + */
-#define REG_SYN_OP_ESC_1INF (1<<4)
-#define REG_SYN_OP_01 (1<<5) /* ? */
-#define REG_SYN_OP_ESC_01 (1<<6)
-#define REG_SYN_OP_INTERVAL (1<<7) /* {lower,upper} */
-#define REG_SYN_OP_ESC_INTERVAL (1<<8)
-#define REG_SYN_OP_ALT (1<<9) /* | */
-#define REG_SYN_OP_ESC_ALT (1<<10)
-#define REG_SYN_OP_SUBEXP (1<<11) /* (...) */
-#define REG_SYN_OP_ESC_SUBEXP (1<<12)
-#define REG_SYN_OP_ESC_BUF_ANCHOR (1<<13) /* \A, \Z, \z */
-#define REG_SYN_OP_ESC_GNU_BUF_ANCHOR (1<<14) /* \`, \' */
-#define REG_SYN_OP_BACK_REF (1<<15) /* \num */
-#define REG_SYN_OP_CC (1<<16) /* [...] */
-#define REG_SYN_OP_ESC_WORD (1<<17) /* \w, \W */
-#define REG_SYN_OP_ESC_WORD_BEGIN_END (1<<18) /* \<. \> */
-#define REG_SYN_OP_ESC_WORD_BOUND (1<<19) /* \b, \B */
-#define REG_SYN_OP_ESC_WHITE_SPACE (1<<20) /* \s, \S */
-#define REG_SYN_OP_ESC_DIGIT (1<<21) /* \d, \D */
-#define REG_SYN_OP_LINE_ANCHOR (1<<22) /* ^, $ */
-#define REG_SYN_OP_POSIX_BRACKET (1<<23) /* [:xxxx:] */
-#define REG_SYN_OP_NON_GREEDY (1<<24) /* ??,*?,+?,{n,m}? */
-#define REG_SYN_OP_ESC_CONTROL_CHAR (1<<25) /* \n,\r,\t,\a ... */
-#define REG_SYN_OP_ESC_C_CONTROL (1<<26) /* \cx */
-#define REG_SYN_OP_ESC_OCTAL3 (1<<27) /* \OOO */
-#define REG_SYN_OP_ESC_X_HEX2 (1<<28) /* \xHH */
-#define REG_SYN_OP_ESC_X_BRACE_HEX8 (1<<29) /* \x{7HHHHHHH} */
-#define REG_SYN_OP_SUBEXP_EFFECT (1<<30) /* (?...) */
-#define REG_SYN_OP_QUOTE (1<<31) /* \Q...\E */
-
-#define REG_SYN_OP2_OPTION_PERL (1<<0) /* (?imsx), (?-imsx) */
-#define REG_SYN_OP2_OPTION_RUBY (1<<1) /* (?imx), (?-imx) */
-#define REG_SYN_OP2_POSSESSIVE_REPEAT (1<<2) /* ?+,*+,++ */
-#define REG_SYN_OP2_POSSESSIVE_INTERVAL (1<<3) /* {n,m}+ */
-#define REG_SYN_OP2_CCLASS_SET (1<<4) /* [...&&..[..].] */
-#define REG_SYN_OP2_NAMED_SUBEXP (1<<5) /*(?<name>.),\k<name>*/
-#define REG_SYN_OP2_SUBEXP_CALL (1<<6) /* \g<name> */
-#define REG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1<<7) /* \C-x */
-#define REG_SYN_OP2_ESC_M_BAR_META (1<<8) /* \M-x */
-#define REG_SYN_OP2_ESC_V_VTAB (1<<9) /* \v as VTAB */
-#define REG_SYN_OP2_ESC_U_HEX4 (1<<10) /* \uHHHH */
+#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1<<0)
+#define ONIG_SYN_OP_DOT_ANYCHAR (1<<1) /* . */
+#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1<<2) /* * */
+#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1<<3)
+#define ONIG_SYN_OP_PLUS_ONE_INF (1<<4) /* + */
+#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1<<5)
+#define ONIG_SYN_OP_QMARK_ZERO_ONE (1<<6) /* ? */
+#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1<<7)
+#define ONIG_SYN_OP_BRACE_INTERVAL (1<<8) /* {lower,upper} */
+#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1<<9) /* \{lower,upper\} */
+#define ONIG_SYN_OP_VBAR_ALT (1<<10) /* | */
+#define ONIG_SYN_OP_ESC_VBAR_ALT (1<<11) /* \| */
+#define ONIG_SYN_OP_LPAREN_SUBEXP (1<<12) /* (...) */
+#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1<<13) /* \(...\) */
+#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1<<14) /* \A, \Z, \z */
+#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1<<15) /* \G */
+#define ONIG_SYN_OP_DECIMAL_BACKREF (1<<16) /* \num */
+#define ONIG_SYN_OP_BRACKET_CC (1<<17) /* [...] */
+#define ONIG_SYN_OP_ESC_W_WORD (1<<18) /* \w, \W */
+#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1<<19) /* \<. \> */
+#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1<<20) /* \b, \B */
+#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1<<21) /* \s, \S */
+#define ONIG_SYN_OP_ESC_D_DIGIT (1<<22) /* \d, \D */
+#define ONIG_SYN_OP_LINE_ANCHOR (1<<23) /* ^, $ */
+#define ONIG_SYN_OP_POSIX_BRACKET (1<<24) /* [:xxxx:] */
+#define ONIG_SYN_OP_QMARK_NON_GREEDY (1<<25) /* ??,*?,+?,{n,m}? */
+#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1<<26) /* \n,\r,\t,\a ... */
+#define ONIG_SYN_OP_ESC_C_CONTROL (1<<27) /* \cx */
+#define ONIG_SYN_OP_ESC_OCTAL3 (1<<28) /* \OOO */
+#define ONIG_SYN_OP_ESC_X_HEX2 (1<<29) /* \xHH */
+#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1<<30) /* \x{7HHHHHHH} */
+
+#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1<<0) /* \Q...\E */
+#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1<<1) /* (?...) */
+#define ONIG_SYN_OP2_OPTION_PERL (1<<2) /* (?imsx),(?-imsx) */
+#define ONIG_SYN_OP2_OPTION_RUBY (1<<3) /* (?imx), (?-imx) */
+#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1<<4) /* ?+,*+,++ */
+#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1<<5) /* {n,m}+ */
+#define ONIG_SYN_OP2_CCLASS_SET_OP (1<<6) /* [...&&..[..]..] */
+#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1<<7) /* (?<name>...) */
+#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1<<8) /* \k<name> */
+#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1<<9) /* \g<name>, \g<n> */
+#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1<<10) /* (?@..),(?@<x>..) */
+#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1<<11) /* \C-x */
+#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1<<12) /* \M-x */
+#define ONIG_SYN_OP2_ESC_V_VTAB (1<<13) /* \v as VTAB */
+#define ONIG_SYN_OP2_ESC_U_HEX4 (1<<14) /* \uHHHH */
+#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1<<15) /* \`, \' */
+#define ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY (1<<16) /* \p{...}, \P{...} */
/* syntax (behavior) */
-#define REG_SYN_CONTEXT_INDEP_ANCHORS (1<<0) /* not implemented */
-#define REG_SYN_CONTEXT_INDEP_OPS (1<<1) /* ?, *, +, {n,m} */
-#define REG_SYN_CONTEXT_INVALID_OPS (1<<2) /* error or ignore */
-#define REG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1<<3) /* ...)... */
-#define REG_SYN_ALLOW_INVALID_INTERVAL (1<<4) /* {??? */
-#define REG_SYN_STRICT_CHECK_BACKREF (1<<5) /* /(\1)/,/\1()/ etc.*/
-#define REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1<<6) /* (?<=a|bc) */
-
-/* syntax in char class [...] */
-#define REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED (1<<10) /* [,-,] */
-#define REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1<<11)
-#define REG_SYN_ESCAPE_IN_CC (1<<12) /* [...\w..] etc.. */
-#define REG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1<<13)
-#define REG_SYN_ALLOW_RANGE_OP_IN_CC (1<<14) /* [0-9-a] */
-
+#define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1<<31) /* not implemented */
+#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS (1<<0) /* ?, *, +, {n,m} */
+#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS (1<<1) /* error or ignore */
+#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP (1<<2) /* ...)... */
+#define ONIG_SYN_ALLOW_INVALID_INTERVAL (1<<3) /* {??? */
+#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV (1<<4) /* {,n} => {0,n} */
+#define ONIG_SYN_STRICT_CHECK_BACKREF (1<<5) /* /(\1)/,/\1()/ ..*/
+#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1<<6) /* (?<=a|bc) */
+#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1<<7) /* see doc/RE */
+#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1<<8) /* (?<x>)(?<x>) */
+
+/* syntax (behavior) in char class [...] */
+#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1<<20) /* [^...] */
+#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1<<21) /* [..\w..] etc.. */
+#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1<<22)
+#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1<<23) /* [0-9-a]=[0-9\-a] */
+/* syntax (behavior) warning */
+#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1<<24) /* [,-,] */
+#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1<<25) /* (?:a*)+ */
+
+/* meta character specifiers (onig_set_meta_char()) */
+#define ONIG_META_CHAR_ESCAPE 0
+#define ONIG_META_CHAR_ANYCHAR 1
+#define ONIG_META_CHAR_ANYTIME 2
+#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3
+#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4
+#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5
+
+#define ONIG_INEFFECTIVE_META_CHAR 0
/* error codes */
-#define REG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -300)
+#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000)
/* normal return */
-#define REG_NORMAL 0
-#define REG_MISMATCH -1
-#define REG_NO_SUPPORT_CONFIG -2
+#define ONIG_NORMAL 0
+#define ONIG_MISMATCH -1
+#define ONIG_NO_SUPPORT_CONFIG -2
/* internal error */
-#define REGERR_MEMORY -5
-#define REGERR_MATCH_STACK_LIMIT_OVER -6
-#define REGERR_TYPE_BUG -10
-#define REGERR_PARSER_BUG -11
-#define REGERR_STACK_BUG -12
-#define REGERR_UNDEFINED_BYTECODE -13
-#define REGERR_UNEXPECTED_BYTECODE -14
-#define REGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21
-#define REGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22
+#define ONIGERR_PARSER_BUG -11
+#define ONIGERR_STACK_BUG -12
+#define ONIGERR_UNDEFINED_BYTECODE -13
+#define ONIGERR_UNEXPECTED_BYTECODE -14
+#define ONIGERR_MATCH_STACK_LIMIT_OVER -15
+#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED -21
+#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22
+/* general error */
+#define ONIGERR_INVALID_ARGUMENT -30
/* syntax error */
-#define REGERR_END_PATTERN_AT_LEFT_BRACE -100
-#define REGERR_END_PATTERN_AT_LEFT_BRACKET -101
-#define REGERR_EMPTY_CHAR_CLASS -102
-#define REGERR_PREMATURE_END_OF_CHAR_CLASS -103
-#define REGERR_END_PATTERN_AT_BACKSLASH -104
-#define REGERR_END_PATTERN_AT_META -105
-#define REGERR_END_PATTERN_AT_CONTROL -106
-#define REGERR_META_CODE_SYNTAX -108
-#define REGERR_CONTROL_CODE_SYNTAX -109
-#define REGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110
-#define REGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111
-#define REGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112
-#define REGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113
-#define REGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114
-#define REGERR_NESTED_REPEAT_OPERATOR -115
-#define REGERR_UNMATCHED_CLOSE_PARENTHESIS -116
-#define REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117
-#define REGERR_END_PATTERN_IN_GROUP -118
-#define REGERR_UNDEFINED_GROUP_OPTION -119
-#define REGERR_INVALID_POSIX_BRACKET_TYPE -121
-#define REGERR_INVALID_LOOK_BEHIND_PATTERN -122
-#define REGERR_INVALID_REPEAT_RANGE_PATTERN -123
+#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100
+#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101
+#define ONIGERR_EMPTY_CHAR_CLASS -102
+#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103
+#define ONIGERR_END_PATTERN_AT_BACKSLASH -104
+#define ONIGERR_END_PATTERN_AT_META -105
+#define ONIGERR_END_PATTERN_AT_CONTROL -106
+#define ONIGERR_META_CODE_SYNTAX -108
+#define ONIGERR_CONTROL_CODE_SYNTAX -109
+#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110
+#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111
+#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112
+#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113
+#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114
+#define ONIGERR_NESTED_REPEAT_OPERATOR -115
+#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116
+#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117
+#define ONIGERR_END_PATTERN_IN_GROUP -118
+#define ONIGERR_UNDEFINED_GROUP_OPTION -119
+#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121
+#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122
+#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123
/* values error (syntax error) */
-#define REGERR_TOO_BIG_NUMBER -200
-#define REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201
-#define REGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202
-#define REGERR_EMPTY_RANGE_IN_CHAR_CLASS -203
-#define REGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204
-#define REGERR_TOO_MANY_MULTI_BYTE_RANGES -205
-#define REGERR_TOO_SHORT_MULTI_BYTE_STRING -206
-#define REGERR_TOO_BIG_BACKREF_NUMBER -207
-#define REGERR_INVALID_BACKREF -208
-#define REGERR_TOO_BIG_WIDE_CHAR_VALUE -209
-#define REGERR_TOO_LONG_WIDE_CHAR_VALUE -210
-#define REGERR_INVALID_WIDE_CHAR_VALUE -211
-#define REGERR_INVALID_SUBEXP_NAME -212
-#define REGERR_UNDEFINED_NAME_REFERENCE -213
-#define REGERR_UNDEFINED_GROUP_REFERENCE -214
-#define REGERR_MULTIPLEX_DEFINITION_NAME_CALL -215
-#define REGERR_NEVER_ENDING_RECURSION -216
+#define ONIGERR_TOO_BIG_NUMBER -200
+#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201
+#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202
+#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203
+#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204
+#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205
+#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206
+#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207
+#define ONIGERR_INVALID_BACKREF -208
+#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209
+#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212
+#define ONIGERR_EMPTY_GROUP_NAME -214
+#define ONIGERR_INVALID_GROUP_NAME -215
+#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216
+#define ONIGERR_UNDEFINED_NAME_REFERENCE -217
+#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218
+#define ONIGERR_MULTIPLEX_DEFINED_NAME -219
+#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220
+#define ONIGERR_NEVER_ENDING_RECURSION -221
+#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222
+#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223
/* errors related to thread */
-#define REGERR_OVER_THREAD_PASS_LIMIT_COUNT -301
+#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001
+
+/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */
+#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31
+#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \
+ ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i])
/* match result region type */
struct re_registers {
int num_regs;
int* beg;
int* end;
+ /* extended */
+ struct re_registers** list; /* capture history. list[1]-list[31] */
};
-#define REG_REGION_NOTPOS -1
+#define ONIG_REGION_NOTPOS -1
-typedef struct re_registers RegRegion;
+typedef struct re_registers OnigRegion;
typedef struct {
UChar* par;
UChar* par_end;
-} RegErrorInfo;
+} OnigErrorInfo;
typedef struct {
int lower;
int upper;
-} RegRepeatRange;
+} OnigRepeatRange;
+
+typedef void (*OnigWarnFunc) P_((char* s));
+extern void onig_null_warn P_((char* s));
+#define ONIG_NULL_WARN onig_null_warn
+
+#define ONIG_CHAR_TABLE_SIZE 256
/* regex_t state */
-#define REG_STATE_NORMAL 0
-#define REG_STATE_SEARCHING 1
-#define REG_STATE_COMPILING -1
-#define REG_STATE_MODIFY -2
+#define ONIG_STATE_NORMAL 0
+#define ONIG_STATE_SEARCHING 1
+#define ONIG_STATE_COMPILING -1
+#define ONIG_STATE_MODIFY -2
-#define REG_STATE(regex) \
- ((regex)->state > 0 ? REG_STATE_SEARCHING : (regex)->state)
+#define ONIG_STATE(reg) \
+ ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state)
typedef struct re_pattern_buffer {
- /* common members in BBuf(bytes-buffer) type */
+ /* common members of BBuf(bytes-buffer) */
unsigned char* p; /* compiled pattern */
unsigned int used; /* used space for p */
unsigned int alloc; /* allocated space for p */
- int state; /* normal, searching, compiling */
- int num_mem; /* used memory(...) num counted from 1 */
- int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */
- int num_null_check; /* OP_NULL_CHECK_START/END id counter */
- int num_call; /* number of subexp call */
- unsigned int backtrack_mem;
+ int state; /* normal, searching, compiling */
+ int num_mem; /* used memory(...) num counted from 1 */
+ int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */
+ int num_null_check; /* OP_NULL_CHECK_START/END id counter */
+ int num_call; /* number of subexp call */
+ unsigned int capture_history; /* (?@...) flag (1-31) */
+ unsigned int bt_mem_start; /* need backtrack flag */
+ unsigned int bt_mem_end; /* need backtrack flag */
int stack_pop_level;
int repeat_range_alloc;
- RegRepeatRange* repeat_range;
+ OnigRepeatRange* repeat_range;
- RegCharEncoding enc;
- RegOptionType options;
- RegSyntaxType* syntax;
+ OnigEncoding enc;
+ OnigOptionType options;
+ OnigSyntaxType* syntax;
void* name_table;
- /* optimize info (string search and char-map and anchor) */
+ /* optimization info (string search, char-map and anchors) */
int optimize; /* optimize flag */
int threshold_len; /* search str-length for apply optimize */
int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */
- RegDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */
- RegDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */
+ OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */
+ OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */
int sub_anchor; /* start-anchor for exact or map */
unsigned char *exact;
unsigned char *exact_end;
- unsigned char map[REG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */
+ unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */
int *int_map; /* BM skip for exact_len > 255 */
int *int_map_backward; /* BM skip for backward search */
- RegDistance dmin; /* min-distance of exact or map */
- RegDistance dmax; /* max-distance of exact or map */
+ OnigDistance dmin; /* min-distance of exact or map */
+ OnigDistance dmax; /* max-distance of exact or map */
/* regex_t link chain */
- struct re_pattern_buffer* chain; /* escape compile-conflict on multi-thread */
+ struct re_pattern_buffer* chain; /* escape compile-conflict */
} regex_t;
-#ifdef RUBY_PLATFORM
-#define re_mbcinit ruby_re_mbcinit
-#define re_compile_pattern ruby_re_compile_pattern
-#define re_recompile_pattern ruby_re_recompile_pattern
-#define re_free_pattern ruby_re_free_pattern
-#define re_adjust_startpos ruby_re_adjust_startpos
-#define re_search ruby_re_search
-#define re_match ruby_re_match
-#define re_set_casetable ruby_re_set_casetable
-#define re_copy_registers ruby_re_copy_registers
-#define re_free_registers ruby_re_free_registers
-#define register_info_type ruby_register_info_type
-#define re_error_code_to_str ruby_error_code_to_str
-
-#define ruby_error_code_to_str regex_error_code_to_str
-#define ruby_re_copy_registers regex_region_copy
-#else
-#define re_error_code_to_str regex_error_code_to_str
-#define re_copy_registers regex_region_copy
-#endif
/* Oniguruma Native API */
-REG_EXTERN
-int regex_init P_((void));
-REG_EXTERN
-int regex_error_code_to_str PV_((UChar* s, int err_code, ...));
-REG_EXTERN
-int regex_new P_((regex_t**, UChar* pattern, UChar* pattern_end, RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax, RegErrorInfo* einfo));
-REG_EXTERN
-void regex_free P_((regex_t*));
-REG_EXTERN
-int regex_recompile P_((regex_t*, UChar* pattern, UChar* pattern_end, RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax, RegErrorInfo* einfo));
-REG_EXTERN
-int regex_search P_((regex_t*, UChar* str, UChar* end, UChar* start, UChar* range, RegRegion* region, RegOptionType option));
-REG_EXTERN
-int regex_match P_((regex_t*, UChar* str, UChar* end, UChar* at, RegRegion* region, RegOptionType option));
-REG_EXTERN
-RegRegion* regex_region_new P_((void));
-REG_EXTERN
-void regex_region_free P_((RegRegion* region, int free_self));
-REG_EXTERN
-void regex_region_copy P_((RegRegion* to, RegRegion* from));
-REG_EXTERN
-void regex_region_clear P_((RegRegion* region));
-REG_EXTERN
-int regex_region_resize P_((RegRegion* region, int n));
-REG_EXTERN
-int regex_name_to_group_numbers P_((regex_t* reg, UChar* name, UChar* name_end,
+ONIG_EXTERN
+int onig_init P_((void));
+ONIG_EXTERN
+int onig_error_code_to_str PV_((UChar* s, int err_code, ...));
+ONIG_EXTERN
+void onig_set_warn_func P_((OnigWarnFunc f));
+ONIG_EXTERN
+void onig_set_verb_warn_func P_((OnigWarnFunc f));
+ONIG_EXTERN
+int onig_new P_((regex_t**, UChar* pattern, UChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));
+ONIG_EXTERN
+void onig_free P_((regex_t*));
+ONIG_EXTERN
+int onig_recompile P_((regex_t*, UChar* pattern, UChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));
+ONIG_EXTERN
+int onig_search P_((regex_t*, UChar* str, UChar* end, UChar* start, UChar* range, OnigRegion* region, OnigOptionType option));
+ONIG_EXTERN
+int onig_match P_((regex_t*, UChar* str, UChar* end, UChar* at, OnigRegion* region, OnigOptionType option));
+ONIG_EXTERN
+OnigRegion* onig_region_new P_((void));
+ONIG_EXTERN
+void onig_region_free P_((OnigRegion* region, int free_self));
+ONIG_EXTERN
+void onig_region_copy P_((OnigRegion* to, OnigRegion* from));
+ONIG_EXTERN
+void onig_region_clear P_((OnigRegion* region));
+ONIG_EXTERN
+int onig_region_resize P_((OnigRegion* region, int n));
+ONIG_EXTERN
+int onig_name_to_group_numbers P_((regex_t* reg, UChar* name, UChar* name_end,
int** nums));
-REG_EXTERN
-int regex_foreach_name P_((regex_t* reg, int (*func)(UChar*,int,int*,void*), void* arg));
-REG_EXTERN
-UChar* regex_get_prev_char_head P_((RegCharEncoding code, UChar* start, UChar* s));
-REG_EXTERN
-UChar* regex_get_left_adjust_char_head P_((RegCharEncoding code, UChar* start, UChar* s));
-REG_EXTERN
-UChar* regex_get_right_adjust_char_head P_((RegCharEncoding code, UChar* start, UChar* s));
-REG_EXTERN
-void regex_set_default_trans_table P_((UChar* table));
-REG_EXTERN
-int regex_set_default_syntax P_((RegSyntaxType* syntax));
-REG_EXTERN
-int regex_end P_((void));
-REG_EXTERN
-const char* regex_version P_((void));
-
-
-/* GNU regex API */
-#ifdef REG_RUBY_M17N
-REG_EXTERN
-void re_mbcinit P_((RegCharEncoding));
-#else
-REG_EXTERN
-void re_mbcinit P_((int));
-#endif
-
-REG_EXTERN
-int re_compile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));
-REG_EXTERN
-int re_recompile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));
-REG_EXTERN
-void re_free_pattern P_((struct re_pattern_buffer*));
-REG_EXTERN
-int re_adjust_startpos P_((struct re_pattern_buffer*, const char*, int, int, int));
-REG_EXTERN
-int re_search P_((struct re_pattern_buffer*, const char*, int, int, int, struct re_registers*));
-REG_EXTERN
-int re_match P_((struct re_pattern_buffer*, const char *, int, int, struct re_registers*));
-REG_EXTERN
-void re_set_casetable P_((const char*));
-REG_EXTERN
-void re_free_registers P_((struct re_registers*));
-REG_EXTERN
-int re_alloc_pattern P_((struct re_pattern_buffer**)); /* added */
+ONIG_EXTERN
+int onig_name_to_backref_number P_((regex_t* reg, UChar* name, UChar* name_end, OnigRegion *region));
+ONIG_EXTERN
+int onig_foreach_name P_((regex_t* reg, int (*func)(UChar*,UChar*,int,int*,regex_t*,void*), void* arg));
+ONIG_EXTERN
+int onig_number_of_names P_((regex_t* reg));
+ONIG_EXTERN
+OnigEncoding onig_get_encoding P_((regex_t* reg));
+ONIG_EXTERN
+OnigOptionType onig_get_options P_((regex_t* reg));
+ONIG_EXTERN
+OnigSyntaxType* onig_get_syntax P_((regex_t* reg));
+ONIG_EXTERN
+int onig_set_default_syntax P_((OnigSyntaxType* syntax));
+ONIG_EXTERN
+void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from));
+ONIG_EXTERN
+void onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op));
+ONIG_EXTERN
+void onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2));
+ONIG_EXTERN
+void onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior));
+ONIG_EXTERN
+void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options));
+ONIG_EXTERN
+int onig_set_meta_char P_((unsigned int what, unsigned int c));
+ONIG_EXTERN
+int onig_end P_((void));
+ONIG_EXTERN
+const char* onig_version P_((void));
#endif /* ONIGURUMA_H */
#ifndef _PHP_MBREGEX_COMPAT_H
#define _PHP_MBREGEX_COMPAT_H
-#define RegCharEncoding php_mb_reg_char_encoding
-#define RegRegion php_mb_reg_region
-#define RegDefaultCharEncoding php_mb_reg_default_char_encoding
-#define REG_MBLEN_TABLE PHP_MBSTR_REG_MBLEN_TABLE
-#define RegSyntaxType php_mb_reg_syntax_type
-#define RegOptionType php_mb_reg_option_type
-#define re_registers php_mb_re_registers
-#define RegErrorInfo php_mb_reg_error_info
#define re_pattern_buffer php_mb_re_pattern_buffer
#define regex_t php_mb_regex_t
-#define regex_init php_mb_regex_init
-#define regex_new php_mb_regex_new
-#define regex_free php_mb_regex_free
-#define regex_recompile php_mb_regex_recompile
-#define regex_search php_mb_regex_search
-#define regex_match php_mb_regex_match
-#define regex_region_new php_mb_regex_region_new
-#define regex_region_free php_mb_regex_region_free
-#define regex_region_copy php_mb_regex_region_copy
-#define regex_region_clear php_mb_regex_region_clear
-#define regex_region_resize php_mb_regex_region_resize
-#define regex_name_to_group_numbers php_mb_regex_name_to_group_numbers
-#define regex_foreach_names php_mb_regex_foreach_names
-#define regex_get_prev_char_head php_mb_regex_get_prev_char_head
-#define regex_get_left_adjust_char_head php_mb_get_left_adjust_char_head
-#define regex_get_right_adjust_char_head php_mb_get_right_adjust_char_head
-#define regex_set_default_trans_table php_mb_get_default_trans_table
-#define regex_set_default_syntax php_mb_regex_set_default_syntax
-#define regex_end php_mb_regex_end
-#define re_mbcinit php_mb_re_mbcinit
-#define re_compile_pattern php_mb_re_compile_pattern
-#define re_recompile_pattern php_mb_re_recompile_pattern
-#define re_free_pattern php_mb_re_free_pattern
-#define re_adjust_startpos php_mb_re_adjust_startpos
-#define re_search php_mb_re_search
-#define re_match php_mb_re_match
-#define re_set_casetable php_mb_re_set_casetable
-#define php_mbregex_region_copy php_mb_re_copy_registers
-#define re_free_registers php_mb_re_free_registers
-#define register_info_type php_mb_register_info_type
-#define regex_error_code_to_str php_mb_regex_error_code_to_str
#endif /* _PHP_MBREGEX_COMPAT_H */
+++ /dev/null
---- re.c.ruby_orig Tue Feb 4 15:52:29 2003
-+++ re.c Tue Mar 18 19:37:49 2003
-@@ -380,7 +380,8 @@ make_regexp(s, len, flag)
- int len, flag;
- {
- Regexp *rp;
-- char *err;
-+ char err[REG_MAX_ERROR_MESSAGE_LEN];
-+ int r;
-
- /* Handle escaped characters first. */
-
-@@ -389,16 +390,17 @@ make_regexp(s, len, flag)
- from that.
- */
-
-- rp = ALLOC(Regexp);
-- MEMZERO((char *)rp, Regexp, 1);
-- rp->buffer = ALLOC_N(char, 16);
-- rp->allocated = 16;
-- rp->fastmap = ALLOC_N(char, 256);
-+ r = re_alloc_pattern(&rp);
-+ if (r) {
-+ re_error_code_to_str(err, r);
-+ rb_reg_raise(s, len, err, 0);
-+ }
-+
- if (flag) {
- rp->options = flag;
- }
-- err = re_compile_pattern(s, len, rp);
-- if (err != NULL) {
-+ r = re_compile_pattern(s, len, rp, err);
-+ if (r != 0) {
- rb_reg_raise(s, len, err, 0);
- }
-
-@@ -532,14 +534,14 @@ rb_reg_prepare_re(re)
- }
-
- if (need_recompile) {
-- char *err;
-+ char err[REG_MAX_ERROR_MESSAGE_LEN];
-+ int r;
-
- if (FL_TEST(re, KCODE_FIXED))
- kcode_set_option(re);
- rb_reg_check(re);
-- RREGEXP(re)->ptr->fastmap_accurate = 0;
-- err = re_compile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr);
-- if (err != NULL) {
-+ r = re_recompile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr, err);
-+ if (r != 0) {
- rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re);
- }
- }
+++ /dev/null
---- re.c.ruby_orig Fri Feb 7 15:35:26 2003
-+++ re.c Tue Mar 18 18:51:21 2003
-@@ -444,7 +444,7 @@ rb_reg_to_s(re)
- kcode_set_option(re);
- rp = ALLOC(Regexp);
- MEMZERO((char *)rp, Regexp, 1);
-- err = re_compile_pattern(++ptr, len -= 2, rp) != 0;
-+ err = (re_compile_pattern(++ptr, len -= 2, rp, NULL) != 0);
- kcode_reset_option();
- re_free_pattern(rp);
- }
-@@ -538,7 +538,8 @@ make_regexp(s, len, flags)
- int flags;
- {
- Regexp *rp;
-- char *err;
-+ char err[REG_MAX_ERROR_MESSAGE_LEN];
-+ int r;
-
- /* Handle escaped characters first. */
-
-@@ -547,17 +548,18 @@ make_regexp(s, len, flags)
- from that.
- */
-
-- rp = ALLOC(Regexp);
-- MEMZERO((char *)rp, Regexp, 1);
-- rp->buffer = ALLOC_N(char, 16);
-- rp->allocated = 16;
-- rp->fastmap = ALLOC_N(char, 256);
-+ r = re_alloc_pattern(&rp);
-+ if (r) {
-+ re_error_code_to_str((UChar* )err, r);
-+ rb_reg_raise(s, len, err, 0);
-+ }
-+
- if (flags) {
- rp->options = flags;
- }
-- err = re_compile_pattern(s, len, rp);
-+ r = re_compile_pattern(s, len, rp, err);
-
-- if (err != NULL) {
-+ if (r != 0) {
- rb_reg_raise(s, len, err, 0);
- }
- return rp;
-@@ -692,14 +694,14 @@ rb_reg_prepare_re(re)
- }
-
- if (need_recompile) {
-- char *err;
-+ char err[REG_MAX_ERROR_MESSAGE_LEN];
-+ int r;
-
- if (FL_TEST(re, KCODE_FIXED))
- kcode_set_option(re);
- rb_reg_check(re);
-- RREGEXP(re)->ptr->fastmap_accurate = 0;
-- err = re_compile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr);
-- if (err != NULL) {
-+ r = re_recompile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr, err);
-+ if (r != 0) {
- rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len, err, re);
- }
- }
regcomp.c - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "regparse.h"
-#ifndef UNALIGNED_WORD_ACCESS
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS
static unsigned char PadBuf[WORD_ALIGNMENT_SIZE];
#endif
c = *a; *a = *b; *b = c;
}
-static RegDistance
-distance_add(RegDistance d1, RegDistance d2)
+static OnigDistance
+distance_add(OnigDistance d1, OnigDistance d2)
{
- if (d1 == INFINITE_DISTANCE || d2 == INFINITE_DISTANCE)
- return INFINITE_DISTANCE;
+ if (d1 == ONIG_INFINITE_DISTANCE || d2 == ONIG_INFINITE_DISTANCE)
+ return ONIG_INFINITE_DISTANCE;
else {
- if (d1 <= INFINITE_DISTANCE - d2) return d1 + d2;
- else return INFINITE_DISTANCE;
+ if (d1 <= ONIG_INFINITE_DISTANCE - d2) return d1 + d2;
+ else return ONIG_INFINITE_DISTANCE;
}
}
-static RegDistance
-distance_multiply(RegDistance d, int m)
+static OnigDistance
+distance_multiply(OnigDistance d, int m)
{
if (m == 0) return 0;
- if (d < INFINITE_DISTANCE / m)
+ if (d < ONIG_INFINITE_DISTANCE / m)
return d * m;
else
- return INFINITE_DISTANCE;
+ return ONIG_INFINITE_DISTANCE;
}
-#if 0
-static RegDistance
-distance_distance(RegDistance d1, RegDistance d2)
-{
- if (d1 == INFINITE_DISTANCE || d2 == INFINITE_DISTANCE)
- return INFINITE_DISTANCE;
-
- if (d1 > d2) return d1 - d2;
- else return d2 - d1;
-}
-#endif
-
-RegCharEncoding RegDefaultCharEncoding = REGCODE_DEFAULT;
-static UChar AmbiguityTable[REG_CHAR_TABLE_SIZE];
-
-#define IS_AMBIGUITY_CHAR(enc, c) (AmbiguityTable[(c)] >= 2)
-
-#ifdef DEFAULT_TRANSTABLE_EXIST
-
-static UChar DTT[] = {
- '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
- '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
- '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
- '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
- '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
- '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
- '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
- '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
- '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
- '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
- '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
- '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
- '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
- '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
- '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
- '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
- '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
- '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
- '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
- '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
- '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
- '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
- '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
- '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
- '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
- '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
- '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
- '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
- '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
- '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
- '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
- '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
-};
-#endif
-
static int
bitset_is_empty(BitSetRef bs)
{
return 1;
}
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
static int
bitset_on_num(BitSetRef bs)
{
#endif
extern int
-regex_bbuf_init(BBuf* buf, int size)
+onig_bbuf_init(BBuf* buf, int size)
{
buf->p = (UChar* )xmalloc(size);
- if (IS_NULL(buf->p)) return(REGERR_MEMORY);
+ if (IS_NULL(buf->p)) return(ONIGERR_MEMORY);
buf->alloc = size;
buf->used = 0;
UnsetAddr* p;
p = (UnsetAddr* )xmalloc(sizeof(UnsetAddr)* size);
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
uslist->num = 0;
uslist->alloc = size;
uslist->us = p;
if (uslist->num >= uslist->alloc) {
size = uslist->alloc * 2;
p = (UnsetAddr* )xrealloc(uslist->us, sizeof(UnsetAddr) * size);
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
uslist->alloc = size;
uslist->us = p;
}
#endif /* USE_SUBEXP_CALL */
-#ifdef REG_RUBY_M17N
-
-extern int
-regex_is_allow_reverse_match(RegCharEncoding enc, UChar* s, UChar* end)
-{
- return IS_INDEPENDENT_TRAIL(enc);
-}
-
-#else /* REG_RUBY_M17N */
-
-const char REG_MBLEN_TABLE[][REG_CHAR_TABLE_SIZE] = {
- { /* ascii */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- },
- { /* euc-jp */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1
- },
- { /* sjis */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
- },
- { /* utf8 */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1
- }
-};
-
-extern int
-regex_mb_max_length(RegCharEncoding code)
-{
- /* can't use switch statement, code isn't int type. */
- if (code == REGCODE_ASCII) return 1;
- else if (code == REGCODE_EUCJP) return 3;
- else if (code == REGCODE_SJIS) return 2;
- else return 6; /* REGCODE_UTF8 */
-}
-
-extern int
-regex_is_allow_reverse_match(RegCharEncoding enc, UChar* s, UChar* end)
-{
- UChar c;
-
- if (IS_INDEPENDENT_TRAIL(enc)) return 1;
-
- c = *s;
- if (enc == REGCODE_EUCJP) {
- if (c <= 0x7e || c == 0x8e || c == 0x8f) return 1;
- }
- else if (enc == REGCODE_SJIS) {
- if (c <= 0x3f || c == 0x7f) return 1;
- }
- return 0;
-}
-
-#endif /* not REG_RUBY_M17N */
-
+#if 0
static int
-bitset_mbmaxlen(BitSetRef bs, int negative, RegCharEncoding enc)
+bitset_mbmaxlen(BitSetRef bs, int negative, OnigEncoding enc)
{
int i;
int len, maxlen = 0;
if (negative) {
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
if (! BITSET_AT(bs, i)) {
- len = mblen(enc, i);
+ len = enc_len(enc, i);
if (len > maxlen) maxlen = len;
}
}
else {
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
if (BITSET_AT(bs, i)) {
- len = mblen(enc, i);
+ len = enc_len(enc, i);
if (len > maxlen) maxlen = len;
}
}
}
return maxlen;
}
-
+#endif
static int
add_opcode(regex_t* reg, int opcode)
{
RelAddrType ra = (RelAddrType )addr;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &ra, SIZE_RELADDR);
#else
UChar buf[SERIALIZE_BUFSIZE];
{
AbsAddrType ra = (AbsAddrType )addr;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &ra, SIZE_ABSADDR);
#else
UChar buf[SERIALIZE_BUFSIZE];
{
LengthType l = (LengthType )len;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &l, SIZE_LENGTH);
#else
UChar buf[SERIALIZE_BUFSIZE];
{
MemNumType n = (MemNumType )num;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &n, SIZE_MEMNUM);
#else
UChar buf[SERIALIZE_BUFSIZE];
{
RepeatNumType n = (RepeatNumType )num;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &n, SIZE_REPEATNUM);
#else
UChar buf[SERIALIZE_BUFSIZE];
#endif
static int
-add_option(regex_t* reg, RegOptionType option)
+add_option(regex_t* reg, OnigOptionType option)
{
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_ADD(reg, &option, SIZE_OPTION);
#else
UChar buf[SERIALIZE_BUFSIZE];
}
static int
-add_opcode_option(regex_t* reg, int opcode, RegOptionType option)
+add_opcode_option(regex_t* reg, int opcode, OnigOptionType option)
{
int r;
}
static int
-compile_tree_empty_check(Node* node, regex_t* reg, int empty_check)
+compile_tree_empty_check(Node* node, regex_t* reg, int empty_info)
{
int r;
int saved_num_null_check = reg->num_null_check;
- if (empty_check) {
+ if (empty_info != 0) {
r = add_opcode(reg, OP_NULL_CHECK_START);
if (r) return r;
r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */
r = compile_tree(node, reg);
if (r) return r;
- if (empty_check) {
- r = add_opcode(reg, OP_NULL_CHECK_END);
+ if (empty_info != 0) {
+ if (empty_info == NQ_TARGET_IS_EMPTY)
+ r = add_opcode(reg, OP_NULL_CHECK_END);
+ else if (empty_info == NQ_TARGET_IS_EMPTY_MEM)
+ r = add_opcode(reg, OP_NULL_CHECK_END_MEMST);
+ else if (empty_info == NQ_TARGET_IS_EMPTY_REC)
+ r = add_opcode(reg, OP_NULL_CHECK_END_MEMST_PUSH);
+
if (r) return r;
r = add_mem_num(reg, saved_num_null_check); /* NULL CHECK ID */
}
compile_length_string_node(StrNode* sn, regex_t* reg)
{
int rlen, r, len, prev_len, slen, ambig, ic;
- RegCharEncoding code = reg->enc;
+ OnigEncoding enc = reg->enc;
UChar *p, *prev;
if (sn->end <= sn->s)
ic = IS_IGNORECASE(reg->options);
p = prev = sn->s;
- prev_len = mblen(code, *p);
+ prev_len = enc_len(enc, *p);
if (ic != 0 && prev_len == 1)
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
else
ambig = 0;
rlen = 0;
for (; p < sn->end; ) {
- len = mblen(code, *p);
+ len = enc_len(enc, *p);
if (len == prev_len) {
slen++;
if (ic != 0 && ambig == 0 && len == 1)
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
}
else {
r = add_compile_string_length(prev, prev_len, slen, reg, ambig);
rlen += r;
if (ic != 0 && len == 1)
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
else
ambig = 0;
compile_string_node(StrNode* sn, regex_t* reg)
{
int r, len, prev_len, slen, ambig, ic;
- RegCharEncoding code = reg->enc;
+ OnigEncoding enc = reg->enc;
UChar *p, *prev;
if (sn->end <= sn->s)
ic = IS_IGNORECASE(reg->options);
p = prev = sn->s;
- prev_len = mblen(code, *p);
+ prev_len = enc_len(enc, *p);
if (ic != 0 && prev_len == 1) {
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
- if (ambig != 0) *p = TOLOWER(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
+ if (ambig != 0)
+ ONIGENC_MBC_TO_LOWER(reg->enc, p, p);
}
else
ambig = 0;
slen = 1;
for (; p < sn->end; ) {
- len = mblen(code, *p);
+ len = enc_len(enc, *p);
if (len == prev_len) {
slen++;
if (ic != 0 && len == 1) {
if (ambig == 0)
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
- if (ambig != 0) *p = TOLOWER(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
+ if (ambig != 0) ONIGENC_MBC_TO_LOWER(reg->enc, p, p);
}
}
else {
r = add_compile_string(prev, prev_len, slen, reg, ambig);
if (r) return r;
if (ic != 0 && len == 1) {
- ambig = IS_AMBIGUITY_CHAR(reg->enc, *p);
- if (ambig != 0) *p = TOLOWER(reg->enc, *p);
+ ambig = ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p);
+ if (ambig != 0) ONIGENC_MBC_TO_LOWER(reg->enc, p, p);
}
else
ambig = 0;
}
static int
-add_multi_byte_cclass_offset(BBuf* mbuf, regex_t* reg, int offset)
+add_multi_byte_cclass(BBuf* mbuf, regex_t* reg)
{
-#ifdef UNALIGNED_WORD_ACCESS
- add_length(reg, mbuf->used - offset);
- return add_bytes(reg, mbuf->p + offset, mbuf->used - offset);
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
+ add_length(reg, mbuf->used);
+ return add_bytes(reg, mbuf->p, mbuf->used);
#else
int r, pad_size;
UChar* p = BBUF_GET_ADD_ADDRESS(reg) + SIZE_LENGTH;
GET_ALIGNMENT_PAD_SIZE(p, pad_size);
- add_length(reg, mbuf->used - offset + (WORD_ALIGNMENT_SIZE - 1));
+ add_length(reg, mbuf->used + (WORD_ALIGNMENT_SIZE - 1));
if (pad_size != 0) add_bytes(reg, PadBuf, pad_size);
- r = add_bytes(reg, mbuf->p + offset, mbuf->used - offset);
+ r = add_bytes(reg, mbuf->p, mbuf->used);
/* padding for return value from compile_length_cclass_node() to be fix. */
pad_size = (WORD_ALIGNMENT_SIZE - 1) - pad_size;
else {
if (bitset_is_empty(cc->bs)) {
/* SIZE_BITSET is included in mbuf->used. */
- len = SIZE_OPCODE - SIZE_BITSET;
+ len = SIZE_OPCODE;
}
else {
- len = SIZE_OPCODE;
+ len = SIZE_OPCODE + SIZE_BITSET;
}
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
len += SIZE_LENGTH + cc->mbuf->used;
#else
len += SIZE_LENGTH + cc->mbuf->used + (WORD_ALIGNMENT_SIZE - 1);
if (cc->not) add_opcode(reg, OP_CCLASS_MB_NOT);
else add_opcode(reg, OP_CCLASS_MB);
- r = add_multi_byte_cclass_offset(cc->mbuf, reg, SIZE_BITSET);
+ r = add_multi_byte_cclass(cc->mbuf, reg);
}
else {
if (cc->not) add_opcode(reg, OP_CCLASS_MIX_NOT);
r = add_bitset(reg, cc->bs);
if (r) return r;
- r = add_multi_byte_cclass_offset(cc->mbuf, reg, SIZE_BITSET);
+ r = add_multi_byte_cclass(cc->mbuf, reg);
}
}
{
#define REPEAT_RANGE_ALLOC 4
- RegRepeatRange* p;
+ OnigRepeatRange* p;
if (reg->repeat_range_alloc == 0) {
- p = (RegRepeatRange* )xmalloc(sizeof(RegRepeatRange) * REPEAT_RANGE_ALLOC);
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ p = (OnigRepeatRange* )xmalloc(sizeof(OnigRepeatRange) * REPEAT_RANGE_ALLOC);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
reg->repeat_range = p;
reg->repeat_range_alloc = REPEAT_RANGE_ALLOC;
}
else if (reg->repeat_range_alloc <= id) {
int n;
n = reg->repeat_range_alloc + REPEAT_RANGE_ALLOC;
- p = (RegRepeatRange* )xrealloc(reg->repeat_range,
- sizeof(RegRepeatRange) * n);
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ p = (OnigRepeatRange* )xrealloc(reg->repeat_range,
+ sizeof(OnigRepeatRange) * n);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
reg->repeat_range = p;
reg->repeat_range_alloc = n;
}
}
static int
-compile_range_repeat_node(QualifierNode* qn, int target_len, int empty_check,
+compile_range_repeat_node(QualifierNode* qn, int target_len, int empty_info,
regex_t* reg)
{
int r;
r = entry_repeat_range(reg, num_repeat, qn->lower, qn->upper);
if (r) return r;
- r = compile_tree_empty_check(qn->target, reg, empty_check);
+ r = compile_tree_empty_check(qn->target, reg, empty_info);
if (r) return r;
r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC : OP_REPEAT_INC_NG);
{
int len, mod_tlen;
int infinite = IS_REPEAT_INFINITE(qn->upper);
- int empty_check = (infinite && qn->target_may_empty);
+ int empty_info = qn->target_empty_info;
int tlen = compile_length_tree(qn->target, reg);
if (tlen < 0) return tlen;
}
}
- if (empty_check)
+ if (empty_info != 0)
mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);
else
mod_tlen = tlen;
{
int i, r, mod_tlen;
int infinite = IS_REPEAT_INFINITE(qn->upper);
- int empty_check = (infinite && qn->target_may_empty);
+ int empty_info = qn->target_empty_info;
int tlen = compile_length_tree(qn->target, reg);
if (tlen < 0) return tlen;
r = compile_tree_n_times(qn->target, qn->lower, reg);
if (r) return r;
if (IS_NOT_NULL(qn->next_head_exact)) {
- r = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);
+ if (IS_MULTILINE(reg->options))
+ r = add_opcode(reg, OP_ANYCHAR_ML_STAR_PEEK_NEXT);
+ else
+ r = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);
if (r) return r;
return add_bytes(reg, NSTRING(qn->next_head_exact).s, 1);
}
- else
- return add_opcode(reg, OP_ANYCHAR_STAR);
+ else {
+ if (IS_MULTILINE(reg->options))
+ return add_opcode(reg, OP_ANYCHAR_ML_STAR);
+ else
+ return add_opcode(reg, OP_ANYCHAR_STAR);
+ }
}
- if (empty_check)
+ if (empty_info != 0)
mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);
else
mod_tlen = tlen;
mod_tlen + SIZE_OP_JUMP);
if (r) return r;
add_bytes(reg, NSTRING(qn->head_exact).s, 1);
- r = compile_tree_empty_check(qn->target, reg, empty_check);
+ r = compile_tree_empty_check(qn->target, reg, empty_info);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + SIZE_OP_JUMP + SIZE_OP_PUSH_OR_JUMP_EXACT1));
mod_tlen + SIZE_OP_JUMP);
if (r) return r;
add_bytes(reg, NSTRING(qn->next_head_exact).s, 1);
- r = compile_tree_empty_check(qn->target, reg, empty_check);
+ r = compile_tree_empty_check(qn->target, reg, empty_info);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + SIZE_OP_JUMP + SIZE_OP_PUSH_IF_PEEK_NEXT));
else {
r = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);
if (r) return r;
- r = compile_tree_empty_check(qn->target, reg, empty_check);
+ r = compile_tree_empty_check(qn->target, reg, empty_info);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_JUMP,
-(mod_tlen + SIZE_OP_JUMP + SIZE_OP_PUSH));
else {
r = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);
if (r) return r;
- r = compile_tree_empty_check(qn->target, reg, empty_check);
+ r = compile_tree_empty_check(qn->target, reg, empty_info);
if (r) return r;
r = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + SIZE_OP_PUSH));
}
r = compile_tree(qn->target, reg);
}
else {
- r = compile_range_repeat_node(qn, mod_tlen, empty_check, reg);
+ r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);
}
return r;
}
compile_length_option_node(EffectNode* node, regex_t* reg)
{
int tlen;
- RegOptionType prev = reg->options;
+ OnigOptionType prev = reg->options;
reg->options = node->option;
tlen = compile_length_tree(node->target, reg);
if (tlen < 0) return tlen;
- return SIZE_OP_SET_OPTION_PUSH + SIZE_OP_SET_OPTION + SIZE_OP_FAIL
- + tlen + SIZE_OP_SET_OPTION;
+ if (IS_DYNAMIC_OPTION(prev ^ node->option)) {
+ return SIZE_OP_SET_OPTION_PUSH + SIZE_OP_SET_OPTION + SIZE_OP_FAIL
+ + tlen + SIZE_OP_SET_OPTION;
+ }
+ else
+ return tlen;
}
static int
compile_option_node(EffectNode* node, regex_t* reg)
{
int r;
- RegOptionType prev = reg->options;
-
- r = add_opcode_option(reg, OP_SET_OPTION_PUSH, node->option);
- if (r) return r;
- r = add_opcode_option(reg, OP_SET_OPTION, prev);
- if (r) return r;
- r = add_opcode(reg, OP_FAIL);
- if (r) return r;
+ OnigOptionType prev = reg->options;
- reg->options = node->option;
- r = compile_tree(node->target, reg);
- reg->options = prev;
- if (r) return r;
+ if (IS_DYNAMIC_OPTION(prev ^ node->option)) {
+ r = add_opcode_option(reg, OP_SET_OPTION_PUSH, node->option);
+ if (r) return r;
+ r = add_opcode_option(reg, OP_SET_OPTION, prev);
+ if (r) return r;
+ r = add_opcode(reg, OP_FAIL);
+ if (r) return r;
- r = add_opcode_option(reg, OP_SET_OPTION, prev);
+ reg->options = node->option;
+ r = compile_tree(node->target, reg);
+ reg->options = prev;
+ if (r) return r;
+ r = add_opcode_option(reg, OP_SET_OPTION, prev);
+ }
+ else {
+ reg->options = node->option;
+ r = compile_tree(node->target, reg);
+ reg->options = prev;
+ }
return r;
}
if (IS_EFFECT_CALLED(node)) {
len = SIZE_OP_MEMORY_START_PUSH + tlen
+ SIZE_OP_CALL + SIZE_OP_JUMP + SIZE_OP_RETURN;
- if (IS_FIND_CONDITION(reg->options))
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))
len += (IS_EFFECT_RECURSION(node)
? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);
else
else
#endif
{
- if (BIT_STATUS_AT(reg->backtrack_mem, node->regnum))
+ if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))
len = SIZE_OP_MEMORY_START_PUSH;
else
len = SIZE_OP_MEMORY_START;
- len += tlen + (IS_FIND_CONDITION(reg->options)
+ len += tlen + (BIT_STATUS_AT(reg->bt_mem_end, node->regnum)
? SIZE_OP_MEMORY_END_PUSH : SIZE_OP_MEMORY_END);
}
break;
break;
default:
- return REGERR_TYPE_BUG;
+ return ONIGERR_TYPE_BUG;
break;
}
if (r) return r;
len = compile_length_tree(node->target, reg);
len += (SIZE_OP_MEMORY_START_PUSH + SIZE_OP_RETURN);
- if (IS_FIND_CONDITION(reg->options))
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))
len += (IS_EFFECT_RECURSION(node)
? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);
else
if (r) return r;
}
#endif
- if (BIT_STATUS_AT(reg->backtrack_mem, node->regnum))
+ if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))
r = add_opcode(reg, OP_MEMORY_START_PUSH);
else
r = add_opcode(reg, OP_MEMORY_START);
if (r) return r;
#ifdef USE_SUBEXP_CALL
if (IS_EFFECT_CALLED(node)) {
- if (IS_FIND_CONDITION(reg->options))
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))
r = add_opcode(reg, (IS_EFFECT_RECURSION(node)
? OP_MEMORY_END_PUSH_REC : OP_MEMORY_END_PUSH));
else
else
#endif
{
- if (IS_FIND_CONDITION(reg->options))
+ if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))
r = add_opcode(reg, OP_MEMORY_END_PUSH);
else
r = add_opcode(reg, OP_MEMORY_END);
break;
default:
- return REGERR_TYPE_BUG;
+ return ONIGERR_TYPE_BUG;
break;
}
if (r) return r;
if (node->char_len < 0) {
r = get_char_length_tree(node->target, reg, &n);
- if (r) return REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ if (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
}
else
n = node->char_len;
if (r) return r;
if (node->char_len < 0) {
r = get_char_length_tree(node->target, reg, &n);
- if (r) return REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ if (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
}
else
n = node->char_len;
break;
default:
- return REGERR_TYPE_BUG;
+ return ONIGERR_TYPE_BUG;
break;
}
BackrefNode* br = &(NBACKREF(node));
if (br->back_num == 1) {
- r = (br->back_static[0] <= 3
+ r = ((!IS_IGNORECASE(reg->options) && br->back_static[0] <= 3)
? SIZE_OPCODE : (SIZE_OPCODE + SIZE_MEMNUM));
}
else {
break;
default:
- return REGERR_TYPE_BUG;
+ return ONIGERR_TYPE_BUG;
break;
}
switch (NCTYPE(node).type) {
case CTYPE_WORD: op = OP_WORD; break;
case CTYPE_NOT_WORD: op = OP_NOT_WORD; break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB: op = OP_WORD_SB; break;
- case CTYPE_WORD_MB: op = OP_WORD_MB; break;
-#endif
default:
- return REGERR_TYPE_BUG;
+ return ONIGERR_TYPE_BUG;
break;
}
r = add_opcode(reg, op);
break;
case N_ANYCHAR:
- r = add_opcode(reg, OP_ANYCHAR);
+ if (IS_MULTILINE(reg->options))
+ r = add_opcode(reg, OP_ANYCHAR_ML);
+ else
+ r = add_opcode(reg, OP_ANYCHAR);
break;
case N_BACKREF:
if (br->back_num == 1) {
n = br->back_static[0];
- switch (n) {
- case 1: r = add_opcode(reg, OP_BACKREF1); break;
- case 2: r = add_opcode(reg, OP_BACKREF2); break;
- case 3: r = add_opcode(reg, OP_BACKREF3); break;
- default:
- r = add_opcode(reg, OP_BACKREFN);
+ if (IS_IGNORECASE(reg->options)) {
+ r = add_opcode(reg, OP_BACKREFN_IC);
if (r) return r;
r = add_mem_num(reg, n);
- break;
+ }
+ else {
+ switch (n) {
+ case 1: r = add_opcode(reg, OP_BACKREF1); break;
+ case 2: r = add_opcode(reg, OP_BACKREF2); break;
+ case 3: r = add_opcode(reg, OP_BACKREF3); break;
+ default:
+ r = add_opcode(reg, OP_BACKREFN);
+ if (r) return r;
+ r = add_mem_num(reg, n);
+ break;
+ }
}
}
else {
int* p;
- add_opcode(reg, OP_BACKREF_MULTI);
+ add_opcode(reg, (IS_IGNORECASE(reg->options) ?
+ OP_BACKREF_MULTI_IC : OP_BACKREF_MULTI));
if (r) return r;
add_length(reg, br->back_num);
if (r) return r;
break;
default:
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
fprintf(stderr, "compile_tree: undefined node type %d\n", NTYPE(node));
#endif
break;
return r;
}
+#ifdef USE_NAMED_GROUP
+typedef struct {
+ int new_val;
+} NumMap;
+
+static int
+noname_disable_map(Node** plink, NumMap* map, int* counter)
+{
+ int r = 0;
+ Node* node = *plink;
+
+ switch (NTYPE(node)) {
+ case N_LIST:
+ case N_ALT:
+ do {
+ r = noname_disable_map(&(NCONS(node).left), map, counter);
+ } while (r == 0 && IS_NOT_NULL(node = NCONS(node).right));
+ break;
+
+ case N_QUALIFIER:
+ {
+ Node** ptarget = &(NQUALIFIER(node).target);
+ Node* old = *ptarget;
+ r = noname_disable_map(ptarget, map, counter);
+ if (*ptarget != old && NTYPE(*ptarget) == N_QUALIFIER) {
+ onig_reduce_nested_qualifier(node, *ptarget);
+ }
+ }
+ break;
+
+ case N_EFFECT:
+ {
+ EffectNode* en = &(NEFFECT(node));
+ if (en->type == EFFECT_MEMORY) {
+ if (IS_EFFECT_NAMED_GROUP(en)) {
+ (*counter)++;
+ map[en->regnum].new_val = *counter;
+ en->regnum = *counter;
+ r = noname_disable_map(&(en->target), map, counter);
+ }
+ else {
+ *plink = en->target;
+ en->target = NULL_NODE;
+ onig_node_free(node);
+ r = noname_disable_map(plink, map, counter);
+ }
+ }
+ else
+ r = noname_disable_map(&(en->target), map, counter);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return r;
+}
+
+static int
+renumber_node_backref(Node* node, NumMap* map)
+{
+ int i, pos, n, old_num;
+ int *backs;
+ BackrefNode* bn = &(NBACKREF(node));
+
+ if (! IS_BACKREF_NAME_REF(bn))
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;
+
+ old_num = bn->back_num;
+ if (IS_NULL(bn->back_dynamic))
+ backs = bn->back_static;
+ else
+ backs = bn->back_dynamic;
+
+ for (i = 0, pos = 0; i < old_num; i++) {
+ n = map[backs[i]].new_val;
+ if (n > 0) {
+ backs[pos] = n;
+ pos++;
+ }
+ }
+
+ bn->back_num = pos;
+ return 0;
+}
+
+static int
+renumber_by_map(Node* node, NumMap* map)
+{
+ int r = 0;
+
+ switch (NTYPE(node)) {
+ case N_LIST:
+ case N_ALT:
+ do {
+ r = renumber_by_map(NCONS(node).left, map);
+ } while (r == 0 && IS_NOT_NULL(node = NCONS(node).right));
+ break;
+ case N_QUALIFIER:
+ r = renumber_by_map(NQUALIFIER(node).target, map);
+ break;
+ case N_EFFECT:
+ r = renumber_by_map(NEFFECT(node).target, map);
+ break;
+
+ case N_BACKREF:
+ r = renumber_node_backref(node, map);
+ break;
+
+ default:
+ break;
+ }
+
+ return r;
+}
+
+static int
+numbered_ref_check(Node* node)
+{
+ int r = 0;
+
+ switch (NTYPE(node)) {
+ case N_LIST:
+ case N_ALT:
+ do {
+ r = numbered_ref_check(NCONS(node).left);
+ } while (r == 0 && IS_NOT_NULL(node = NCONS(node).right));
+ break;
+ case N_QUALIFIER:
+ r = numbered_ref_check(NQUALIFIER(node).target);
+ break;
+ case N_EFFECT:
+ r = numbered_ref_check(NEFFECT(node).target);
+ break;
+
+ case N_BACKREF:
+ if (! IS_BACKREF_NAME_REF(&(NBACKREF(node))))
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;
+ break;
+
+ default:
+ break;
+ }
+
+ return r;
+}
+
+static int
+disable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env)
+{
+ int r, i, pos, counter;
+ BitStatusType loc;
+ NumMap* map;
+
+ map = (NumMap* )xalloca(sizeof(NumMap) * (env->num_mem + 1));
+ CHECK_NULL_RETURN_VAL(map, ONIGERR_MEMORY);
+ for (i = 1; i <= env->num_mem; i++) {
+ map[i].new_val = 0;
+ }
+ counter = 0;
+ r = noname_disable_map(root, map, &counter);
+ if (r != 0) return r;
+
+ r = renumber_by_map(*root, map);
+ if (r != 0) return r;
+
+ for (i = 1, pos = 1; i <= env->num_mem; i++) {
+ if (map[i].new_val > 0) {
+ SCANENV_MEM_NODES(env)[pos] = SCANENV_MEM_NODES(env)[i];
+ pos++;
+ }
+ }
+
+ loc = env->capture_history;
+ BIT_STATUS_CLEAR(env->capture_history);
+ for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
+ if (BIT_STATUS_AT(loc, i)) {
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, map[i].new_val);
+ }
+ }
+
+ env->num_mem = env->num_named;
+ reg->num_mem = env->num_named;
+ return 0;
+}
+#endif /* USE_NAMED_GROUP */
+
#ifdef USE_SUBEXP_CALL
static int
unset_addr_list_fix(UnsetAddrList* uslist, regex_t* reg)
int i, offset;
EffectNode* en;
AbsAddrType addr;
-#ifndef UNALIGNED_WORD_ACCESS
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS
UChar buf[SERIALIZE_BUFSIZE];
#endif
for (i = 0; i < uslist->num; i++) {
en = &(NEFFECT(uslist->us[i].target));
- if (! IS_EFFECT_ADDR_FIXED(en)) return REGERR_PARSER_BUG;
+ if (! IS_EFFECT_ADDR_FIXED(en)) return ONIGERR_PARSER_BUG;
addr = en->call_addr;
offset = uslist->us[i].offset;
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
BBUF_WRITE(reg, offset, &addr, SIZE_ABSADDR);
#else
SERIALIZE_ABSADDR(addr, buf);
}
#endif
+#ifdef USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK
static int
-get_min_match_length(Node* node, RegDistance *min, ScanEnv* env)
+qualifiers_memory_node_info(Node* node)
{
- RegDistance tmin;
+ int r = 0;
+
+ switch (NTYPE(node)) {
+ case N_LIST:
+ case N_ALT:
+ {
+ int v;
+ do {
+ v = qualifiers_memory_node_info(NCONS(node).left);
+ if (v > r) r = v;
+ } while (v >= 0 && IS_NOT_NULL(node = NCONS(node).right));
+ }
+ break;
+
+#ifdef USE_SUBEXP_CALL
+ case N_CALL:
+ if (IS_CALL_RECURSION(&NCALL(node))) {
+ return NQ_TARGET_IS_EMPTY_REC; /* tiny version */
+ }
+ else
+ r = qualifiers_memory_node_info(NCALL(node).target);
+ break;
+#endif
+
+ case N_QUALIFIER:
+ {
+ QualifierNode* qn = &(NQUALIFIER(node));
+ if (qn->upper != 0) {
+ r = qualifiers_memory_node_info(qn->target);
+ }
+ }
+ break;
+
+ case N_EFFECT:
+ {
+ EffectNode* en = &(NEFFECT(node));
+ switch (en->type) {
+ case EFFECT_MEMORY:
+ return NQ_TARGET_IS_EMPTY_MEM;
+ break;
+
+ case EFFECT_OPTION:
+ case EFFECT_STOP_BACKTRACK:
+ r = qualifiers_memory_node_info(en->target);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+
+ case N_BACKREF:
+ case N_STRING:
+ case N_CTYPE:
+ case N_CCLASS:
+ case N_ANYCHAR:
+ case N_ANCHOR:
+ default:
+ break;
+ }
+
+ return r;
+}
+#endif /* USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK */
+
+static int
+get_min_match_length(Node* node, OnigDistance *min, ScanEnv* env)
+{
+ OnigDistance tmin;
int r = 0;
*min = 0;
if (br->state & NST_RECURSION) break;
backs = BACKREFS_P(br);
- if (backs[0] > env->num_mem) return REGERR_INVALID_BACKREF;
+ if (backs[0] > env->num_mem) return ONIGERR_INVALID_BACKREF;
r = get_min_match_length(nodes[backs[0]], min, env);
if (r != 0) break;
for (i = 1; i < br->back_num; i++) {
- if (backs[i] > env->num_mem) return REGERR_INVALID_BACKREF;
+ if (backs[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;
r = get_min_match_length(nodes[backs[i]], &tmin, env);
if (r != 0) break;
if (*min > tmin) *min = tmin;
switch (NCTYPE(node).type) {
case CTYPE_WORD: *min = 1; break;
case CTYPE_NOT_WORD: *min = 1; break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB: *min = 1; break;
- case CTYPE_WORD_MB: *min = 2; break;
-#endif
default:
break;
}
}
static int
-get_max_match_length(Node* node, RegDistance *max, ScanEnv* env)
+get_max_match_length(Node* node, OnigDistance *max, ScanEnv* env)
{
- RegDistance tmax;
+ OnigDistance tmax;
int r = 0;
*max = 0;
switch (NCTYPE(node).type) {
case CTYPE_WORD:
case CTYPE_NOT_WORD:
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_MB:
-#endif
- *max = mbmaxlen_dist(env->enc);
+ *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);
break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- *max = 1;
- break;
-#endif
-
default:
break;
}
case N_CCLASS:
case N_ANYCHAR:
- *max = mbmaxlen_dist(env->enc);
+ *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);
break;
case N_BACKREF:
Node** nodes = SCANENV_MEM_NODES(env);
BackrefNode* br = &(NBACKREF(node));
if (br->state & NST_RECURSION) {
- *max = INFINITE_DISTANCE;
+ *max = ONIG_INFINITE_DISTANCE;
break;
}
backs = BACKREFS_P(br);
for (i = 0; i < br->back_num; i++) {
- if (backs[i] > env->num_mem) return REGERR_INVALID_BACKREF;
+ if (backs[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;
r = get_max_match_length(nodes[backs[i]], &tmax, env);
if (r != 0) break;
if (*max < tmax) *max = tmax;
if (! IS_CALL_RECURSION(&(NCALL(node))))
r = get_max_match_length(NCALL(node).target, max, env);
else
- *max = INFINITE_DISTANCE;
+ *max = ONIG_INFINITE_DISTANCE;
break;
#endif
if (! IS_REPEAT_INFINITE(qn->upper))
*max = distance_multiply(*max, qn->upper);
else
- *max = INFINITE_DISTANCE;
+ *max = ONIG_INFINITE_DISTANCE;
}
}
}
StrNode* sn = &(NSTRING(node));
UChar *s = sn->s;
while (s < sn->end) {
- s += mblen(reg->enc, *s);
+ s += enc_len(reg->enc, *s);
(*len)++;
}
}
switch (NCTYPE(node).type) {
case CTYPE_WORD:
case CTYPE_NOT_WORD:
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- case CTYPE_WORD_MB:
-#endif
*len = 1;
break;
}
return get_char_length_tree1(node, reg, len, 0);
}
+extern int
+onig_is_code_in_cc(OnigEncoding enc, OnigCodePoint code, CClassNode* cc)
+{
+ int found;
+
+ if (code >= SINGLE_BYTE_SIZE) {
+ if (IS_NULL(cc->mbuf)) {
+ found = 0;
+ }
+ else {
+ found = (onig_is_in_code_range(cc->mbuf->p, code) != 0 ? 1 : 0);
+ }
+ }
+ else {
+ found = (BITSET_AT(cc->bs, code) == 0 ? 0 : 1);
+ }
+
+ if (cc->not == 0)
+ return found;
+ else
+ return !found;
+}
+
/* x is not included y ==> 1 : 0 */
static int
is_not_included(Node* x, Node* y, regex_t* reg)
{
int i, len;
- WCINT wc;
+ OnigCodePoint code;
UChar *p, c;
int ytype;
else
return 0;
break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- case CTYPE_WORD_MB:
- break;
-#endif
default:
break;
}
if (IS_NULL(xc->mbuf) && xc->not == 0) {
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
if (BITSET_AT(xc->bs, i)) {
- if (IS_SB_WORD(reg->enc, i)) return 0;
+ if (ONIGENC_IS_CODE_SB_WORD(reg->enc, i)) return 0;
}
}
return 1;
break;
case CTYPE_NOT_WORD:
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
- if (! IS_SB_WORD(reg->enc, i)) {
+ if (! ONIGENC_IS_CODE_SB_WORD(reg->enc, i)) {
if (xc->not == 0) {
if (BITSET_AT(xc->bs, i))
return 0;
return 1;
break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- case CTYPE_WORD_MB:
- break;
-#endif
default:
break;
}
case N_CTYPE:
switch (NCTYPE(y).type) {
case CTYPE_WORD:
- return (IS_WORD_STR(reg->enc, xs->s, xs->end) ? 0 : 1);
+ return (ONIGENC_IS_MBC_WORD(reg->enc, xs->s, xs->end) ? 0 : 1);
break;
case CTYPE_NOT_WORD:
- return (IS_WORD_STR(reg->enc, xs->s, xs->end) ? 1 : 0);
- break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- return (ismb(reg->enc, c) ? 1 : 0);
+ return (ONIGENC_IS_MBC_WORD(reg->enc, xs->s, xs->end) ? 1 : 0);
break;
- case CTYPE_WORD_MB:
- return (ismb(reg->enc, c) ? 0 : 1);
- break;
-#endif
default:
break;
}
case N_CCLASS:
{
CClassNode* cc = &(NCCLASS(y));
- if (ismb(reg->enc, c)) {
- if (IS_NULL(cc->mbuf))
- return (cc->not == 0 ? 1 : 0);
- else {
- len = mblen(reg->enc, c);
- wc = MB2WC(xs->s, xs->s + len, reg->enc);
- p = cc->mbuf->p + SIZE_BITSET;
- if (regex_is_in_wc_range(p, wc))
- return (cc->not == 0 ? 0 : 1);
- else
- return (cc->not == 0 ? 1 : 0);
- }
- }
- else {
- if (BITSET_AT(cc->bs, c) == 0)
- return (cc->not == 0 ? 1 : 0);
- else
- return (cc->not == 0 ? 0 : 1);
- }
+
+ code = ONIGENC_MBC_TO_CODE(reg->enc, xs->s,
+ xs->s + enc_len(reg->enc, c));
+ return (onig_is_code_in_cc(reg->enc, code, cc) != 0 ? 0 : 1);
}
break;
len = NSTRING_LEN(x);
if (len > NSTRING_LEN(y)) len = NSTRING_LEN(y);
if (NSTRING_IS_CASE_AMBIG(x) || NSTRING_IS_CASE_AMBIG(y)) {
- for (i = 0, p = ys->s, q = xs->s; i < len; i++, p++, q++) {
- if (TOLOWER(reg->enc, *p) != TOLOWER(reg->enc, *q))
- return 1;
+ UChar plow[ONIGENC_MBC_TO_LOWER_MAXLEN];
+ UChar qlow[ONIGENC_MBC_TO_LOWER_MAXLEN];
+ int plen, qlen;
+ for (p = ys->s, q = xs->s; q < xs->end; ) {
+ plen = ONIGENC_MBC_TO_LOWER(reg->enc, p, plow);
+ qlen = ONIGENC_MBC_TO_LOWER(reg->enc, q, qlow);
+ if (plen != qlen || onig_strncmp(plow, qlow, plen) != 0)
+ return 1;
+ p += enc_len(reg->enc, *p);
+ q += enc_len(reg->enc, *q);
}
}
else {
if (exact != 0 &&
!NSTRING_IS_RAW(node) && IS_IGNORECASE(reg->options)) {
- if (! IS_AMBIGUITY_CHAR(reg->enc, *(sn->s)))
+ if (! ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, sn->s))
n = node;
}
else {
switch (en->type) {
case EFFECT_OPTION:
{
- RegOptionType options = reg->options;
+ OnigOptionType options = reg->options;
reg->options = NEFFECT(node).option;
n = get_head_value_node(NEFFECT(node).target, exact, reg);
case N_LIST:
{
Node *x;
- RegDistance min;
+ OnigDistance min;
int ret;
x = node;
if (IS_EFFECT_RECURSION(en)) {
SET_EFFECT_STATUS(node, NST_MARK1);
r = subexp_inf_recursive_check(en->target, env, 1);
- if (r > 0) return REGERR_NEVER_ENDING_RECURSION;
+ if (r > 0) return ONIGERR_NEVER_ENDING_RECURSION;
CLEAR_EFFECT_STATUS(node, NST_MARK1);
}
r = subexp_inf_recursive_check_trav(en->target, env);
CallNode* cn = &(NCALL(node));
Node** nodes = SCANENV_MEM_NODES(env);
-#ifdef USE_NAMED_SUBEXP
- n = regex_name_to_group_numbers(env->reg, cn->name, cn->name_end, &refs);
+#ifdef USE_NAMED_GROUP
+ n = onig_name_to_group_numbers(env->reg, cn->name, cn->name_end, &refs);
#else
- n = REGERR_UNDEFINED_GROUP_REFERENCE;
+ n = -1;
#endif
if (n <= 0) {
/* name not found, check group number. (?*ddd) */
p = cn->name;
- num = regex_scan_unsigned_number(&p, cn->name_end, env->enc);
+ num = onig_scan_unsigned_number(&p, cn->name_end, env->enc);
if (num <= 0 || p != cn->name_end) {
- regex_scan_env_set_error_string(env,
- REGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);
- return REGERR_UNDEFINED_NAME_REFERENCE;
+ onig_scan_env_set_error_string(env,
+ ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;
+ }
+#ifdef USE_NAMED_GROUP
+ if (env->num_named > 0 &&
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&
+ !ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_CAPTURE_GROUP)) {
+ return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;
+ }
+#endif
+ if (num > env->num_mem) {
+ onig_scan_env_set_error_string(env,
+ ONIGERR_UNDEFINED_GROUP_REFERENCE, cn->name, cn->name_end);
+ return ONIGERR_UNDEFINED_GROUP_REFERENCE;
}
- if (num > env->num_mem) return REGERR_UNDEFINED_GROUP_REFERENCE;
cn->ref_num = num;
goto set_call_attr;
}
else if (n > 1) {
- regex_scan_env_set_error_string(env,
- REGERR_MULTIPLEX_DEFINITION_NAME_CALL, cn->name, cn->name_end);
- return REGERR_MULTIPLEX_DEFINITION_NAME_CALL;
+ onig_scan_env_set_error_string(env,
+ ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL, cn->name, cn->name_end);
+ return ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL;
}
else {
cn->ref_num = refs[0];
set_call_attr:
cn->target = nodes[cn->ref_num];
- if (IS_NULL(cn->target)) return REGERR_INVALID_SUBEXP_NAME;
+ if (IS_NULL(cn->target)) {
+ onig_scan_env_set_error_string(env,
+ ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;
+ }
SET_EFFECT_STATUS(cn->target, NST_CALLED);
- BIT_STATUS_ON_AT(env->backtrack_mem, cn->ref_num);
+ BIT_STATUS_ON_AT(env->bt_mem_start, cn->ref_num);
cn->unset_addr_list = env->unset_addr_list;
}
}
np = node;
while ((np = NCONS(np).right) != NULL_NODE) {
- insert_node = regex_node_new_anchor(anc_type);
- CHECK_NULL_RETURN_VAL(insert_node, REGERR_MEMORY);
+ insert_node = onig_node_new_anchor(anc_type);
+ CHECK_NULL_RETURN_VAL(insert_node, ONIGERR_MEMORY);
NANCHOR(insert_node).target = NCONS(np).left;
NCONS(np).left = insert_node;
}
if (r == 0)
an->char_len = len;
else if (r == GET_CHAR_LEN_VARLEN)
- r = REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
else if (r == GET_CHAR_LEN_TOP_ALT_VARLEN) {
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND))
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND))
r = divide_look_behind_alternatives(node);
else
- r = REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
}
return r;
if (IS_NOT_NULL(x)) {
y = get_head_value_node(next_node, 0, reg);
if (IS_NOT_NULL(y) && is_not_included(x, y, reg)) {
- Node* en = regex_node_new_effect(EFFECT_STOP_BACKTRACK);
- CHECK_NULL_RETURN_VAL(en, REGERR_MEMORY);
+ Node* en = onig_node_new_effect(EFFECT_STOP_BACKTRACK);
+ CHECK_NULL_RETURN_VAL(en, ONIGERR_MEMORY);
SET_EFFECT_STATUS(en, NST_SIMPLE_REPEAT);
swap_node(node, en);
NEFFECT(node).target = en;
#define IN_REPEAT (1<<2)
/* setup_tree does the following work.
- 1. check empty loop. (set qn->target_may_empty)
+ 1. check empty loop. (set qn->target_empty_info)
2. expand ignore-case in char class.
3. set memory status bit flags. (reg->mem_stats)
4. set qn->head_exact for [push, exact] -> [push_or_jump_exact1, exact].
case N_CCLASS:
if (IS_IGNORECASE(reg->options)) {
- int c, t;
+ int i;
+ UChar c, lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
BitSetRef bs = NCCLASS(node).bs;
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- t = TOLOWER(reg->enc, c);
- if (t != c) {
- if (BITSET_AT(bs, c)) BITSET_SET_BIT(bs, t);
- if (BITSET_AT(bs, t)) BITSET_SET_BIT(bs, c);
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
+ c = (UChar )i;
+ ONIGENC_MBC_TO_LOWER(reg->enc, &c, lowbuf);
+ if (*lowbuf != c) {
+ if (BITSET_AT(bs, c)) BITSET_SET_BIT(bs, *lowbuf);
+ if (BITSET_AT(bs, *lowbuf)) BITSET_SET_BIT(bs, c);
}
}
}
UChar* p = sn->s;
while (p < sn->end) {
- if (IS_AMBIGUITY_CHAR(reg->enc, *p)) {
+ if (ONIGENC_IS_MBC_CASE_AMBIG(reg->enc, p)) {
NSTRING_SET_CASE_AMBIG(node);
break;
}
BackrefNode* br = &(NBACKREF(node));
p = BACKREFS_P(br);
for (i = 0; i < br->back_num; i++) {
- if (p[i] > env->num_mem) return REGERR_INVALID_BACKREF;
+ if (p[i] > env->num_mem) return ONIGERR_INVALID_BACKREF;
BIT_STATUS_ON_AT(env->backrefed_mem, p[i]);
- BIT_STATUS_ON_AT(env->backtrack_mem, p[i]);
+ BIT_STATUS_ON_AT(env->bt_mem_start, p[i]);
SET_EFFECT_STATUS(nodes[p[i]], NST_MEM_BACKREFED);
}
}
case N_QUALIFIER:
{
- RegDistance d;
+ OnigDistance d;
QualifierNode* qn = &(NQUALIFIER(node));
Node* target = qn->target;
r = get_min_match_length(target, &d, env);
if (r) break;
if (d == 0) {
- qn->target_may_empty = 1;
+ qn->target_empty_info = NQ_TARGET_IS_EMPTY;
+#ifdef USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK
+ r = qualifiers_memory_node_info(target);
+ if (r < 0) break;
+ if (r > 0) {
+ qn->target_empty_info = r;
+ }
+#endif
#if 0
r = get_max_match_length(target, &d, env);
if (r == 0 && d == 0) {
if (len * qn->lower <= EXPAND_STRING_MAX_LENGTH) {
int i, n = qn->lower;
- regex_node_conv_to_str_node(node, NSTRING(target).flag);
+ onig_node_conv_to_str_node(node, NSTRING(target).flag);
for (i = 0; i < n; i++) {
- r = regex_node_str_cat(node, sn->s, sn->end);
+ r = onig_node_str_cat(node, sn->s, sn->end);
if (r) break;
}
- regex_node_free(target);
+ onig_node_free(target);
break; /* break case N_QUALIFIER: */
}
}
}
#ifdef USE_OP_PUSH_OR_JUMP_EXACT
- if (qn->greedy && !qn->target_may_empty) {
+ if (qn->greedy && (qn->target_empty_info != 0)) {
if (NTYPE(target) == N_QUALIFIER) {
QualifierNode* tqn = &(NQUALIFIER(target));
if (IS_NOT_NULL(tqn->head_exact)) {
switch (en->type) {
case EFFECT_OPTION:
{
- RegOptionType options = reg->options;
+ OnigOptionType options = reg->options;
reg->options = NEFFECT(node).option;
r = setup_tree(NEFFECT(node).target, reg, state, env);
reg->options = options;
case EFFECT_MEMORY:
if ((state & (IN_ALT | IN_NOT | IN_REPEAT)) != 0) {
- BIT_STATUS_ON_AT(env->backtrack_mem, en->regnum);
+ BIT_STATUS_ON_AT(env->bt_mem_start, en->regnum);
/* SET_EFFECT_STATUS(node, NST_MEM_IN_ALT_NOT); */
}
/* fall */
r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,
ALLOWED_EFFECT_IN_LB, ALLOWED_ANCHOR_IN_LB);
if (r < 0) return r;
- if (r > 0) return REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
r = setup_look_behind(node, reg, env);
if (r != 0) return r;
r = setup_tree(an->target, reg, state, env);
r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,
ALLOWED_EFFECT_IN_LB_NOT, ALLOWED_ANCHOR_IN_LB_NOT);
if (r < 0) return r;
- if (r > 0) return REGERR_INVALID_LOOK_BEHIND_PATTERN;
+ if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;
r = setup_look_behind(node, reg, env);
if (r != 0) return r;
r = setup_tree(an->target, reg, (state | IN_NOT), env);
/* set skip map for Boyer-Moor search */
static int
-set_bm_skip(UChar* s, UChar* end, RegCharEncoding enc, int ignore_case,
+set_bm_skip(UChar* s, UChar* end, OnigEncoding enc, int ignore_case,
UChar skip[], int** int_skip)
{
int i, len;
+ UChar lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
len = end - s;
- if (len < REG_CHAR_TABLE_SIZE) {
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++) skip[i] = len;
+ if (len < ONIG_CHAR_TABLE_SIZE) {
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) skip[i] = len;
if (ignore_case) {
- for (i = 0; i < len - 1; i++)
- skip[TOLOWER(enc, s[i])] = len - 1 - i;
+ for (i = 0; i < len - 1; i++) {
+ ONIGENC_MBC_TO_LOWER(enc, &(s[i]), lowbuf);
+ skip[*lowbuf] = len - 1 - i;
+ }
}
else {
for (i = 0; i < len - 1; i++)
}
else {
if (IS_NULL(*int_skip)) {
- *int_skip = (int* )xmalloc(sizeof(int) * REG_CHAR_TABLE_SIZE);
- if (IS_NULL(*int_skip)) return REGERR_MEMORY;
+ *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);
+ if (IS_NULL(*int_skip)) return ONIGERR_MEMORY;
}
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = len;
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = len;
if (ignore_case) {
- for (i = 0; i < len - 1; i++)
- (*int_skip)[TOLOWER(enc, s[i])] = len - 1 - i;
+ for (i = 0; i < len - 1; i++) {
+ ONIGENC_MBC_TO_LOWER(enc, &(s[i]), lowbuf);
+ (*int_skip)[*lowbuf] = len - 1 - i;
+ }
}
else {
for (i = 0; i < len - 1; i++)
#define OPT_EXACT_MAXLEN 24
typedef struct {
- RegDistance min; /* min byte length */
- RegDistance max; /* max byte length */
+ OnigDistance min; /* min byte length */
+ OnigDistance max; /* max byte length */
} MinMaxLen;
typedef struct {
MinMaxLen mmd;
BitStatusType backrefed_status;
- RegCharEncoding enc;
- RegOptionType options;
- RegTransTableType transtable;
+ OnigEncoding enc;
+ OnigOptionType options;
ScanEnv* scan_env;
} OptEnv;
OptAncInfo anc;
int value; /* weighted value */
- UChar map[REG_CHAR_TABLE_SIZE];
+ UChar map[ONIG_CHAR_TABLE_SIZE];
} OptMapInfo;
typedef struct {
int d;
- if (mm->max == INFINITE_DISTANCE) return 0;
+ if (mm->max == ONIG_INFINITE_DISTANCE) return 0;
d = mm->max - mm->min;
if (d < sizeof(dist_vals)/sizeof(dist_vals[0]))
static void
-set_mml(MinMaxLen* mml, RegDistance min, RegDistance max)
+set_mml(MinMaxLen* mml, OnigDistance min, OnigDistance max)
{
mml->min = min;
mml->max = max;
}
static void
-add_len_mml(MinMaxLen* to, RegDistance len)
+add_len_mml(MinMaxLen* to, OnigDistance len)
{
to->min = distance_add(to->min, len);
to->max = distance_add(to->max, len);
static void
concat_opt_anc_info(OptAncInfo* to, OptAncInfo* left, OptAncInfo* right,
- RegDistance left_len, RegDistance right_len)
+ OnigDistance left_len, OnigDistance right_len)
{
clear_opt_anc_info(to);
static void
concat_opt_exact_info_str(OptExactInfo* to,
- UChar* s, UChar* end, int raw, RegCharEncoding code)
+ UChar* s, UChar* end, int raw, OnigEncoding enc)
{
int i, j, len;
UChar *p;
to->s[i++] = *p++;
}
else {
- len = mblen(code, *p);
+ len = enc_len(enc, *p);
+ if (i + len > OPT_EXACT_MAXLEN) break;
for (j = 0; j < len; j++)
to->s[i++] = *p++;
}
for (i = 0; i < to->len && i < add->len; ) {
if (to->s[i] != add->s[i]) break;
- len = mblen(env->enc, to->s[i]);
+ len = enc_len(env->enc, to->s[i]);
for (j = 1; j < len; j++) {
if (to->s[i+j] != add->s[i+j]) break;
clear_mml(&map->mmd);
clear_opt_anc_info(&map->anc);
map->value = 0;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
map->map[i] = 0;
}
}
static void
-add_char_amb_opt_map_info(OptMapInfo* map, int c, RegCharEncoding enc)
+add_char_amb_opt_map_info(OptMapInfo* map, int c, OnigEncoding enc)
{
- int i, t;
+ UChar x, low[ONIGENC_MBC_TO_LOWER_MAXLEN];
add_char_opt_map_info(map, c);
- t = TOLOWER(enc, c);
- if (t != c) {
- add_char_opt_map_info(map, t);
+
+ x = (UChar )c;
+ ONIGENC_MBC_TO_LOWER(enc, &x, low);
+ if (*low != x) {
+ add_char_opt_map_info(map, (int )(*low));
}
else {
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++) {
- t = TOLOWER(enc, i);
- if (t == c) add_char_opt_map_info(map, i);
+ int i;
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {
+ x = (UChar )i;
+ ONIGENC_MBC_TO_LOWER(enc, &x, low);
+ if ((int )(*low) == c) add_char_opt_map_info(map, i);
}
}
}
alt_merge_mml(&to->mmd, &add->mmd);
val = 0;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++) {
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {
if (add->map[i])
to->map[i] = 1;
}
if (add->map.value > 0 && to->len.max == 0) {
- concat_opt_anc_info(&tanc, &to->anc, &add->map.anc,
- to->len.max, add->len.max);
- copy_opt_anc_info(&add->map.anc, &tanc);
+ if (add->map.mmd.max == 0)
+ add->map.anc.left_anchor |= to->anc.left_anchor;
}
exb_reach = to->exb.reach_end;
}
else {
for (p = sn->s; p < sn->end; ) {
- len = mblen(env->enc, *p);
- if (len == 1 && IS_AMBIGUITY_CHAR(env->enc, *p)) {
+ len = enc_len(env->enc, *p);
+ if (len == 1 && ONIGENC_IS_MBC_CASE_AMBIG(env->enc, p)) {
break;
}
p += len;
if (slen > 0) {
if (p == sn->s)
- add_char_amb_opt_map_info(&opt->map, *(sn->s), env->transtable);
+ add_char_amb_opt_map_info(&opt->map, *(sn->s), env->enc);
else
add_char_opt_map_info(&opt->map, *(sn->s));
}
case N_CCLASS:
{
- int i, z, len, found;
+ int i, z, len, found, mb_found;
CClassNode* cc = &(NCCLASS(node));
/* no need to check ignore case. (setted in setup_tree()) */
- found = 0;
+ found = mb_found = 0;
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
z = BITSET_AT(cc->bs, i);
if ((z && !cc->not) || (!z && cc->not)) {
}
}
- if (IS_NOT_NULL(cc->mbuf)) {
+ if (IS_NULL(cc->mbuf)) {
+ if (cc->not) {
+ for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
+ add_char_opt_map_info(&opt->map, i);
+ }
+ mb_found = 1;
+ }
+ }
+ else {
for (i = 0; i < SINGLE_BYTE_SIZE; i++) {
- if (BITSET_AT((BitSetRef )(cc->mbuf->p), i)) {
- found = 1;
+ z = ONIGENC_IS_MBC_HEAD(env->enc, i);
+ if (z) {
+ mb_found = 1;
add_char_opt_map_info(&opt->map, i);
}
}
}
- if (found) {
- if (IS_NULL(cc->mbuf))
- len = bitset_mbmaxlen(cc->bs, cc->not, env->enc);
- else
- len = mbmaxlen_dist(env->enc);
-
+ if (mb_found) {
+ len = ONIGENC_MBC_MAXLEN_DIST(env->enc);
+ set_mml(&opt->len, 1, len);
+ }
+ else if (found) {
+ len = 1;
set_mml(&opt->len, 1, len);
}
}
int c;
int len, min, max;
- min = mbmaxlen_dist(env->enc);
+ min = ONIGENC_MBC_MAXLEN_DIST(env->enc);
max = 0;
+#define IS_WORD_HEAD_BYTE(enc,b) \
+ (ONIGENC_IS_MBC_ASCII(&b) ? ONIGENC_IS_CODE_WORD(enc,((OnigCodePoint )b)) \
+ : ONIGENC_IS_MBC_HEAD(enc,b))
+
switch (NCTYPE(node).type) {
case CTYPE_WORD:
for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_WORD_HEAD(env->enc, c)) {
+ if (IS_WORD_HEAD_BYTE(env->enc, c)) {
add_char_opt_map_info(&opt->map, c);
- len = mblen(env->enc, c);
+ len = enc_len(env->enc, c);
if (len < min) min = len;
if (len > max) max = len;
}
case CTYPE_NOT_WORD:
for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_WORD_HEAD(env->enc, c)) {
+ if (! IS_WORD_HEAD_BYTE(env->enc, c)) {
add_char_opt_map_info(&opt->map, c);
- len = mblen(env->enc, c);
+ len = enc_len(env->enc, c);
if (len < min) min = len;
if (len > max) max = len;
}
}
break;
-
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_SB_WORD(env->enc, c)) {
- add_char_opt_map_info(&opt->map, c);
- }
- }
- min = max = 1;
- break;
-
- case CTYPE_WORD_MB:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_MB_WORD(env->enc, c)) {
- add_char_opt_map_info(&opt->map, c);
- len = mblen(env->enc, c);
- if (len < min) min = len;
- if (len > max) max = len;
- }
- }
- break;
-#endif
}
set_mml(&opt->len, min, max);
case N_ANYCHAR:
{
- RegDistance len = mbmaxlen_dist(env->enc);
+ OnigDistance len = ONIGENC_MBC_MAXLEN_DIST(env->enc);
set_mml(&opt->len, 1, len);
}
break;
{
int i;
int* backs;
- RegDistance min, max, tmin, tmax;
+ OnigDistance min, max, tmin, tmax;
Node** nodes = SCANENV_MEM_NODES(env->scan_env);
BackrefNode* br = &(NBACKREF(node));
if (br->state & NST_RECURSION) {
- set_mml(&opt->len, 0, INFINITE_DISTANCE);
+ set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);
break;
}
backs = BACKREFS_P(br);
#ifdef USE_SUBEXP_CALL
case N_CALL:
if (IS_CALL_RECURSION(&(NCALL(node))))
- set_mml(&opt->len, 0, INFINITE_DISTANCE);
+ set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);
else {
+ OnigOptionType save = env->options;
+ env->options = NEFFECT(NCALL(node).target).option;
r = optimize_node_left(NCALL(node).target, opt, env);
+ env->options = save;
}
break;
#endif
case N_QUALIFIER:
{
int i;
- RegDistance min, max;
+ OnigDistance min, max;
NodeOptInfo nopt;
QualifierNode* qn = &(NQUALIFIER(node));
min = distance_multiply(nopt.len.min, qn->lower);
if (IS_REPEAT_INFINITE(qn->upper))
- max = (nopt.len.max > 0 ? INFINITE_DISTANCE : 0);
+ max = (nopt.len.max > 0 ? ONIG_INFINITE_DISTANCE : 0);
else
max = distance_multiply(nopt.len.max, qn->upper);
switch (en->type) {
case EFFECT_OPTION:
{
- RegOptionType save = env->options;
+ OnigOptionType save = env->options;
env->options = en->option;
r = optimize_node_left(en->target, opt, env);
#ifdef USE_SUBEXP_CALL
en->opt_count++;
if (en->opt_count > MAX_NODE_OPT_INFO_REF_COUNT) {
- RegDistance min, max;
+ OnigDistance min, max;
min = 0;
- max = INFINITE_DISTANCE;
+ max = ONIG_INFINITE_DISTANCE;
if (IS_EFFECT_MIN_FIXED(en)) min = en->min_len;
if (IS_EFFECT_MAX_FIXED(en)) max = en->max_len;
set_mml(&opt->len, min, max);
break;
default:
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
fprintf(stderr, "optimize_node_left: undefined node type %d\n",
NTYPE(node));
#endif
- r = REGERR_TYPE_BUG;
+ r = ONIGERR_TYPE_BUG;
break;
}
if (e->len == 0) return 0;
- reg->exact = regex_strdup(e->s, e->s + e->len);
- if (IS_NULL(reg->exact)) return REGERR_MEMORY;
+ reg->exact = onig_strdup(e->s, e->s + e->len);
+ CHECK_NULL_RETURN_VAL(reg->exact, ONIGERR_MEMORY);
reg->exact_end = reg->exact + e->len;
if (e->ignore_case) {
- UChar *p;
- int len;
- for (p = reg->exact; p < reg->exact_end; ) {
- len = mblen(reg->enc, *p);
- if (len == 1) {
- *p = TOLOWER(reg->enc, *p);
+ UChar buf[ONIGENC_MBC_TO_LOWER_MAXLEN];
+ int len, low_len, i, j, alloc_size;
+
+ alloc_size = e->len;
+ i = j = 0;
+ while (i < e->len) {
+ low_len = ONIGENC_MBC_TO_LOWER(reg->enc, &(e->s[i]), buf);
+ len = enc_len(reg->enc, e->s[i]);
+ if (low_len > alloc_size - i) {
+ reg->exact = xrealloc(reg->exact, alloc_size * 2);
+ CHECK_NULL_RETURN_VAL(reg->exact, ONIGERR_MEMORY);
+ alloc_size *= 2;
}
- p += len;
+
+ xmemcpy(&(reg->exact[j]), buf, low_len);
+ i += len;
+ j += low_len;
}
- reg->optimize = REG_OPTIMIZE_EXACT_IC;
+ reg->exact_end = reg->exact + j;
+ reg->optimize = ONIG_OPTIMIZE_EXACT_IC;
}
else {
int allow_reverse;
allow_reverse = 1;
else
allow_reverse =
- regex_is_allow_reverse_match(reg->enc, reg->exact, reg->exact_end);
+ ONIGENC_IS_ALLOWED_REVERSE_MATCH(reg->enc, reg->exact, reg->exact_end);
if (e->len >= 3 || (e->len >= 2 && allow_reverse)) {
r = set_bm_skip(reg->exact, reg->exact_end, reg->enc, 0,
if (r) return r;
reg->optimize = (allow_reverse != 0
- ? REG_OPTIMIZE_EXACT_BM : REG_OPTIMIZE_EXACT_BM_NOT_REV);
+ ? ONIG_OPTIMIZE_EXACT_BM : ONIG_OPTIMIZE_EXACT_BM_NOT_REV);
}
else {
- reg->optimize = REG_OPTIMIZE_EXACT;
+ reg->optimize = ONIG_OPTIMIZE_EXACT;
}
}
reg->dmin = e->mmd.min;
reg->dmax = e->mmd.max;
- if (reg->dmin != INFINITE_DISTANCE) {
+ if (reg->dmin != ONIG_INFINITE_DISTANCE) {
reg->threshold_len = reg->dmin + (reg->exact_end - reg->exact);
}
{
int i;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
reg->map[i] = m->map[i];
- reg->optimize = REG_OPTIMIZE_MAP;
+ reg->optimize = ONIG_OPTIMIZE_MAP;
reg->dmin = m->mmd.min;
reg->dmax = m->mmd.max;
- if (reg->dmin != INFINITE_DISTANCE) {
+ if (reg->dmin != ONIG_INFINITE_DISTANCE) {
reg->threshold_len = reg->dmin + 1;
}
}
reg->sub_anchor |= anc->right_anchor & ANCHOR_END_LINE;
}
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
static void print_optimize_info(FILE* f, regex_t* reg);
#endif
reg->sub_anchor |= opt.anc.right_anchor & ANCHOR_END_LINE;
}
-#if defined(REG_DEBUG_COMPILE) || defined(REG_DEBUG_MATCH)
+#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH)
print_optimize_info(stderr, reg);
#endif
return r;
static void
clear_optimize_info(regex_t* reg)
{
- reg->optimize = REG_OPTIMIZE_NONE;
+ reg->optimize = ONIG_OPTIMIZE_NONE;
reg->anchor = 0;
reg->anchor_dmin = 0;
reg->anchor_dmax = 0;
}
}
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
static void
-print_distance_range(FILE* f, RegDistance a, RegDistance b)
+print_distance_range(FILE* f, OnigDistance a, OnigDistance b)
{
- if (a == INFINITE_DISTANCE)
+ if (a == ONIG_INFINITE_DISTANCE)
fputs("inf", f);
else
fprintf(f, "(%u)", a);
fputs("-", f);
- if (b == INFINITE_DISTANCE)
+ if (b == ONIG_INFINITE_DISTANCE)
fputs("inf", f);
else
fprintf(f, "(%u)", b);
}
fprintf(f, "]: length: %d\n", (reg->exact_end - reg->exact));
}
- else if (reg->optimize & REG_OPTIMIZE_MAP) {
+ else if (reg->optimize & ONIG_OPTIMIZE_MAP) {
int i, n = 0;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
if (reg->map[i]) n++;
fprintf(f, "map: n=%d\n", n);
if (n > 0) {
fputc('[', f);
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
- if (reg->map[i] && mblen(reg->enc, i) == 1 &&
- IS_CODE_PRINT(reg->enc, i))
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
+ if (reg->map[i] && enc_len(reg->enc, i) == 1 &&
+ ONIGENC_IS_CODE_PRINT(reg->enc, i))
fputc(i, f);
fprintf(f, "]\n");
}
}
}
-#endif /* REG_DEBUG */
+#endif /* ONIG_DEBUG */
static void
-regex_free_body(regex_t* reg)
+onig_free_body(regex_t* reg)
{
if (IS_NOT_NULL(reg->p)) xfree(reg->p);
if (IS_NOT_NULL(reg->exact)) xfree(reg->exact);
if (IS_NOT_NULL(reg->int_map)) xfree(reg->int_map);
if (IS_NOT_NULL(reg->int_map_backward)) xfree(reg->int_map_backward);
if (IS_NOT_NULL(reg->repeat_range)) xfree(reg->repeat_range);
- if (IS_NOT_NULL(reg->chain)) regex_free(reg->chain);
+ if (IS_NOT_NULL(reg->chain)) onig_free(reg->chain);
-#ifdef USE_NAMED_SUBEXP
- regex_names_free(reg);
+#ifdef USE_NAMED_GROUP
+ onig_names_free(reg);
#endif
}
extern void
-regex_free(regex_t* reg)
+onig_free(regex_t* reg)
{
if (IS_NOT_NULL(reg)) {
- regex_free_body(reg);
+ onig_free_body(reg);
xfree(reg);
}
}
#define REGEX_TRANSFER(to,from) do {\
- (to)->state = REG_STATE_MODIFY;\
- regex_free_body(to);\
+ (to)->state = ONIG_STATE_MODIFY;\
+ onig_free_body(to);\
xmemcpy(to, from, sizeof(regex_t));\
xfree(from);\
} while (0)
static void
-regex_transfer(regex_t* to, regex_t* from)
+onig_transfer(regex_t* to, regex_t* from)
{
THREAD_ATOMIC_START;
REGEX_TRANSFER(to, from);
} while (0)
static void
-regex_chain_link_add(regex_t* to, regex_t* add)
+onig_chain_link_add(regex_t* to, regex_t* add)
{
THREAD_ATOMIC_START;
REGEX_CHAIN_HEAD(to);
}
extern void
-regex_chain_reduce(regex_t* reg)
+onig_chain_reduce(regex_t* reg)
{
regex_t *head, *prev;
prev = reg;
head = prev->chain;
if (IS_NOT_NULL(head)) {
- reg->state = REG_STATE_MODIFY;
+ reg->state = ONIG_STATE_MODIFY;
while (IS_NOT_NULL(head->chain)) {
prev = head;
head = head->chain;
#if 0
extern int
-regex_clone(regex_t** to, regex_t* from)
+onig_clone(regex_t** to, regex_t* from)
{
int r, size;
regex_t* reg;
- if (REG_STATE(from) == REG_STATE_NORMAL) {
+ if (ONIG_STATE(from) == ONIG_STATE_NORMAL) {
from->state++; /* increment as search counter */
if (IS_NOT_NULL(from->chain)) {
- regex_chain_reduce(from);
+ onig_chain_reduce(from);
from->state++;
}
}
else {
int n = 0;
- while (REG_STATE(from) < REG_STATE_NORMAL) {
+ while (ONIG_STATE(from) < ONIG_STATE_NORMAL) {
if (++n > THREAD_PASS_LIMIT_COUNT)
- return REGERR_OVER_THREAD_PASS_LIMIT_COUNT;
+ return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;
THREAD_PASS;
}
from->state++; /* increment as search counter */
}
- r = regex_alloc_init(®, REG_OPTION_NONE, RegDefaultCharEncoding,
- REG_TRANSTABLE_USE_DEFAULT);
+ r = onig_alloc_init(®, ONIG_OPTION_NONE, from->enc, ONIG_SYNTAX_DEFAULT);
if (r != 0) {
from->state--;
return r;
}
- xmemcpy(reg, from, sizeof(regex_t));
- reg->state = REG_STATE_NORMAL;
+ xmemcpy(reg, from, sizeof(onig_t));
+ reg->state = ONIG_STATE_NORMAL;
reg->chain = (regex_t* )NULL;
if (from->p) {
}
if (from->int_map) {
- size = sizeof(int) * REG_CHAR_TABLE_SIZE;
+ size = sizeof(int) * ONIG_CHAR_TABLE_SIZE;
reg->int_map = (int* )xmalloc(size);
if (IS_NULL(reg->int_map)) goto mem_error;
xmemcpy(reg->int_map, from->int_map, size);
}
if (from->int_map_backward) {
- size = sizeof(int) * REG_CHAR_TABLE_SIZE;
+ size = sizeof(int) * ONIG_CHAR_TABLE_SIZE;
reg->int_map_backward = (int* )xmalloc(size);
if (IS_NULL(reg->int_map_backward)) goto mem_error;
xmemcpy(reg->int_map_backward, from->int_map_backward, size);
}
-#ifdef USE_NAMED_SUBEXP
+#ifdef USE_NAMED_GROUP
reg->name_table = names_clone(from); /* names_clone is not implemented */
#endif
mem_error:
from->state--;
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
}
#endif
-#ifdef REG_DEBUG
-static void print_tree P_((FILE* f, Node* node));
+#ifdef ONIG_DEBUG
static void print_compiled_byte_code_list P_((FILE* f, regex_t* reg));
#endif
+#ifdef ONIG_DEBUG_PARSE_TREE
+static void print_tree P_((FILE* f, Node* node));
+#endif
extern int
-regex_compile(regex_t* reg, UChar* pattern, UChar* pattern_end,
- RegErrorInfo* einfo)
+onig_compile(regex_t* reg, UChar* pattern, UChar* pattern_end,
+ OnigErrorInfo* einfo)
{
#define COMPILE_INIT_SIZE 20
UnsetAddrList uslist;
#endif
- reg->state = REG_STATE_COMPILING;
+ reg->state = ONIG_STATE_COMPILING;
if (reg->alloc == 0) {
init_size = (pattern_end - pattern) * 2;
if (init_size <= 0) init_size = COMPILE_INIT_SIZE;
r = BBUF_INIT(reg, init_size);
- if (r) goto end;
+ if (r != 0) goto end;
}
else
reg->used = 0;
reg->num_repeat = 0;
reg->num_null_check = 0;
reg->repeat_range_alloc = 0;
- reg->repeat_range = (RegRepeatRange* )NULL;
+ reg->repeat_range = (OnigRepeatRange* )NULL;
+
+ r = onig_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env);
+ if (r != 0) goto err;
+
+#ifdef USE_NAMED_GROUP
+ /* mixed use named group and no-named group */
+ if (scan_env.num_named > 0 &&
+ IS_SYNTAX_BV(scan_env.syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&
+ !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {
+ if (scan_env.num_named != scan_env.num_mem)
+ r = disable_noname_group_capture(&root, reg, &scan_env);
+ else
+ r = numbered_ref_check(root);
- r = regex_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env);
- if (r) goto err;
+ if (r != 0) goto err;
+ }
+#endif
-#ifdef REG_DEBUG_PARSE_TREE
+#ifdef ONIG_DEBUG_PARSE_TREE
print_tree(stderr, root);
#endif
#ifdef USE_SUBEXP_CALL
if (scan_env.num_call > 0) {
r = unset_addr_list_init(&uslist, scan_env.num_call);
- if (r) goto err;
+ if (r != 0) goto err;
scan_env.unset_addr_list = &uslist;
r = setup_subexp_call(root, &scan_env);
- if (r) goto err_unset;
+ if (r != 0) goto err_unset;
r = subexp_recursive_check_trav(root, &scan_env);
- if (r < 0) goto err_unset;
+ if (r < 0) goto err_unset;
r = subexp_inf_recursive_check_trav(root, &scan_env);
- if (r) goto err_unset;
+ if (r != 0) goto err_unset;
reg->num_call = scan_env.num_call;
}
#endif
r = setup_tree(root, reg, 0, &scan_env);
- if (r) goto err_unset;
+ if (r != 0) goto err_unset;
- reg->backtrack_mem = scan_env.backtrack_mem;
+ reg->capture_history = scan_env.capture_history;
+ reg->bt_mem_start = scan_env.bt_mem_start;
+ reg->bt_mem_start |= reg->capture_history;
+ if (IS_FIND_CONDITION(reg->options))
+ BIT_STATUS_ON_ALL(reg->bt_mem_end);
+ else {
+ reg->bt_mem_end = scan_env.bt_mem_end;
+ reg->bt_mem_end |= reg->capture_history;
+ }
clear_optimize_info(reg);
-#ifndef REG_DONT_OPTIMIZE
+#ifndef ONIG_DONT_OPTIMIZE
r = set_optimize_info_from_tree(root, reg, &scan_env);
- if (r) goto err_unset;
+ if (r != 0) goto err_unset;
#endif
if (IS_NOT_NULL(scan_env.mem_nodes_dynamic)) {
}
#endif
- if ((reg->num_repeat != 0) || IS_FIND_CONDITION(reg->options))
+ if ((reg->num_repeat != 0) || (reg->bt_mem_end != 0))
reg->stack_pop_level = STACK_POP_LEVEL_ALL;
else {
- if (reg->backtrack_mem != 0)
+ if (reg->bt_mem_start != 0)
reg->stack_pop_level = STACK_POP_LEVEL_MEM_START;
else
reg->stack_pop_level = STACK_POP_LEVEL_FREE;
unset_addr_list_end(&uslist);
}
#endif
- regex_node_free(root);
+ onig_node_free(root);
-#ifdef REG_DEBUG_COMPILE
-#ifdef USE_NAMED_SUBEXP
- regex_print_names(stderr, reg);
+#ifdef ONIG_DEBUG_COMPILE
+#ifdef USE_NAMED_GROUP
+ onig_print_names(stderr, reg);
#endif
print_compiled_byte_code_list(stderr, reg);
#endif
end:
- reg->state = REG_STATE_NORMAL;
+ reg->state = ONIG_STATE_NORMAL;
return r;
err_unset:
}
}
- if (IS_NOT_NULL(root)) regex_node_free(root);
+ if (IS_NOT_NULL(root)) onig_node_free(root);
if (IS_NOT_NULL(scan_env.mem_nodes_dynamic))
xfree(scan_env.mem_nodes_dynamic);
return r;
}
extern int
-regex_recompile(regex_t* reg, UChar* pattern, UChar* pattern_end,
- RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax,
- RegErrorInfo* einfo)
+onig_recompile(regex_t* reg, UChar* pattern, UChar* pattern_end,
+ OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,
+ OnigErrorInfo* einfo)
{
int r;
regex_t *new_reg;
- r = regex_new(&new_reg, pattern, pattern_end, option, code, syntax, einfo);
+ r = onig_new(&new_reg, pattern, pattern_end, option, enc, syntax, einfo);
if (r) return r;
- if (REG_STATE(reg) == REG_STATE_NORMAL) {
- regex_transfer(reg, new_reg);
+ if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {
+ onig_transfer(reg, new_reg);
}
else {
- regex_chain_link_add(reg, new_reg);
+ onig_chain_link_add(reg, new_reg);
}
return 0;
}
-static int regex_inited = 0;
+static int onig_inited = 0;
extern int
-regex_alloc_init(regex_t** reg, RegOptionType option, RegCharEncoding enc,
- RegSyntaxType* syntax)
+onig_alloc_init(regex_t** reg, OnigOptionType option, OnigEncoding enc,
+ OnigSyntaxType* syntax)
{
- if (! regex_inited)
- regex_init();
+ if (! onig_inited)
+ onig_init();
+
+ if (ONIGENC_IS_UNDEF(enc))
+ return ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED;
*reg = (regex_t* )xmalloc(sizeof(regex_t));
- if (IS_NULL(*reg)) return REGERR_MEMORY;
+ if (IS_NULL(*reg)) return ONIGERR_MEMORY;
- if ((option & REG_OPTION_NEGATE_SINGLELINE) != 0) {
+ if ((option & ONIG_OPTION_NEGATE_SINGLELINE) != 0) {
option |= syntax->options;
- option &= ~REG_OPTION_SINGLELINE;
+ option &= ~ONIG_OPTION_SINGLELINE;
}
else
option |= syntax->options;
- (*reg)->state = REG_STATE_NORMAL;
+ (*reg)->state = ONIG_STATE_NORMAL;
(*reg)->enc = enc;
(*reg)->options = option;
(*reg)->syntax = syntax;
}
extern int
-regex_new(regex_t** reg, UChar* pattern, UChar* pattern_end,
- RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax,
- RegErrorInfo* einfo)
+onig_new(regex_t** reg, UChar* pattern, UChar* pattern_end,
+ OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,
+ OnigErrorInfo* einfo)
{
int r;
if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL;
- r = regex_alloc_init(reg, option, code, syntax);
+ r = onig_alloc_init(reg, option, enc, syntax);
if (r) return r;
- r = regex_compile(*reg, pattern, pattern_end, einfo);
+ r = onig_compile(*reg, pattern, pattern_end, einfo);
if (r) {
- regex_free(*reg);
+ onig_free(*reg);
*reg = NULL;
}
return r;
}
-extern void
-regex_set_default_trans_table(UChar* table)
+extern int
+onig_init()
{
- int i;
+ if (onig_inited != 0)
+ return 0;
- if (table && table != DefaultTransTable) {
- DefaultTransTable = table;
+ onig_inited = 1;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
- AmbiguityTable[i] = 0;
+ THREAD_ATOMIC_START;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++) {
- AmbiguityTable[table[i]]++;
- if (table[i] != i)
- AmbiguityTable[i] += 2;
- }
- }
-}
+ onigenc_init();
+ onigenc_set_default_caseconv_table((UChar* )0);
-extern int
-regex_init()
-{
- regex_inited = 1;
-
- THREAD_ATOMIC_START;
-#ifdef DEFAULT_TRANSTABLE_EXIST
- if (! DefaultTransTable) /* check re_set_casetable() called already. */
- regex_set_default_trans_table(DTT);
+#ifdef ONIG_DEBUG_STATISTICS
+ onig_statistics_init();
#endif
-#ifdef REG_DEBUG_STATISTICS
- regex_statistics_init();
-#endif
THREAD_ATOMIC_END;
-
return 0;
}
extern int
-regex_end()
+onig_end()
{
-#ifdef REG_DEBUG_STATISTICS
- regex_print_statistics(stderr);
+#ifdef ONIG_DEBUG_STATISTICS
+ onig_print_statistics(stderr);
#endif
#ifdef USE_RECYCLE_NODE
- regex_free_node_list();
+ onig_free_node_list();
#endif
- regex_inited = 0;
+ onig_inited = 0;
return 0;
}
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
-RegOpInfoType RegOpInfo[] = {
+OnigOpInfoType OnigOpInfo[] = {
{ OP_FINISH, "finish", ARG_NON },
{ OP_END, "end", ARG_NON },
{ OP_EXACT1, "exact1", ARG_SPECIAL },
{ OP_CCLASS_MB_NOT, "cclass-mb-not", ARG_SPECIAL },
{ OP_CCLASS_MIX_NOT, "cclass-mix-not", ARG_SPECIAL },
{ OP_ANYCHAR, "anychar", ARG_NON },
+ { OP_ANYCHAR_ML, "anychar-ml", ARG_NON },
{ OP_ANYCHAR_STAR, "anychar*", ARG_NON },
+ { OP_ANYCHAR_ML_STAR, "anychar-ml*", ARG_NON },
{ OP_ANYCHAR_STAR_PEEK_NEXT, "anychar*-peek-next", ARG_SPECIAL },
+ { OP_ANYCHAR_ML_STAR_PEEK_NEXT, "anychar-ml*-peek-next", ARG_SPECIAL },
{ OP_WORD, "word", ARG_NON },
{ OP_NOT_WORD, "not-word", ARG_NON },
{ OP_WORD_SB, "word-sb", ARG_NON },
{ OP_BACKREF2, "backref2", ARG_NON },
{ OP_BACKREF3, "backref3", ARG_NON },
{ OP_BACKREFN, "backrefn", ARG_MEMNUM },
+ { OP_BACKREFN_IC, "backrefn-ic", ARG_MEMNUM },
{ OP_BACKREF_MULTI, "backref_multi", ARG_SPECIAL },
+ { OP_BACKREF_MULTI_IC, "backref_multi-ic",ARG_SPECIAL },
{ OP_MEMORY_START_PUSH, "mem-start-push", ARG_MEMNUM },
{ OP_MEMORY_START, "mem-start", ARG_MEMNUM },
{ OP_MEMORY_END_PUSH, "mem-end-push", ARG_MEMNUM },
{ OP_REPEAT_INC_NG, "repeat-inc-ng", ARG_MEMNUM },
{ OP_NULL_CHECK_START, "null-check-start",ARG_MEMNUM },
{ OP_NULL_CHECK_END, "null-check-end", ARG_MEMNUM },
+ { OP_NULL_CHECK_END_MEMST,"null-check-end-memst", ARG_MEMNUM },
+ { OP_NULL_CHECK_END_MEMST_PUSH,"null-check-end-memst-push", ARG_MEMNUM },
{ OP_PUSH_POS, "push-pos", ARG_NON },
{ OP_POP_POS, "pop-pos", ARG_NON },
{ OP_PUSH_POS_NOT, "push-pos-not", ARG_RELADDR },
{
int i;
- for (i = 0; RegOpInfo[i].opcode >= 0; i++) {
- if (opcode == RegOpInfo[i].opcode)
- return RegOpInfo[i].name;
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {
+ if (opcode == OnigOpInfo[i].opcode)
+ return OnigOpInfo[i].name;
}
return "";
}
{
int i;
- for (i = 0; RegOpInfo[i].opcode >= 0; i++) {
- if (opcode == RegOpInfo[i].opcode)
- return RegOpInfo[i].arg_type;
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {
+ if (opcode == OnigOpInfo[i].opcode)
+ return OnigOpInfo[i].arg_type;
}
return ARG_SPECIAL;
}
}
extern void
-regex_print_compiled_byte_code(FILE* f, UChar* bp, UChar** nextp)
+onig_print_compiled_byte_code(FILE* f, UChar* bp, UChar** nextp)
{
int i, n, arg_type;
RelAddrType addr;
LengthType len;
MemNumType mem;
- WCINT wc;
+ OnigCodePoint code;
UChar *q;
fprintf(f, "[%s", op2name(*bp));
break;
case ARG_OPTION:
{
- RegOptionType option = *((RegOptionType* )bp);
+ OnigOptionType option = *((OnigOptionType* )bp);
bp += SIZE_OPTION;
fprintf(f, ":%d", option);
}
switch (*bp++) {
case OP_EXACT1:
case OP_ANYCHAR_STAR_PEEK_NEXT:
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:
p_string(f, 1, bp++); break;
case OP_EXACT2:
p_string(f, 2, bp); bp += 2; break;
case OP_CCLASS_MB_NOT:
GET_LENGTH_INC(len, bp);
q = bp;
-#ifndef UNALIGNED_WORD_ACCESS
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS
ALIGNMENT_RIGHT(q);
#endif
- GET_WCINT(wc, q);
+ GET_CODE_POINT(code, q);
bp += len;
- fprintf(f, ":%d:%d", (int )wc, len);
+ fprintf(f, ":%d:%d", (int )code, len);
break;
case OP_CCLASS_MIX:
bp += SIZE_BITSET;
GET_LENGTH_INC(len, bp);
q = bp;
-#ifndef UNALIGNED_WORD_ACCESS
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS
ALIGNMENT_RIGHT(q);
#endif
- GET_WCINT(wc, q);
+ GET_CODE_POINT(code, q);
bp += len;
- fprintf(f, ":%d:%d:%d", n, (int )wc, len);
+ fprintf(f, ":%d:%d:%d", n, (int )code, len);
break;
case OP_BACKREF_MULTI:
+ case OP_BACKREF_MULTI_IC:
fputs(" ", f);
GET_LENGTH_INC(len, bp);
for (i = 0; i < len; i++) {
break;
default:
- fprintf(stderr, "regex_print_compiled_byte_code: undefined code %d\n",
+ fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n",
*--bp);
}
}
else
fputs(" ", f);
}
- regex_print_compiled_byte_code(f, bp, &bp);
+ onig_print_compiled_byte_code(f, bp, &bp);
}
fprintf(f, "\n");
case N_STRING:
fprintf(f, "<string%s:%x>",
(NSTRING_IS_RAW(node) ? "-raw" : ""), (int )node);
- for (p = NSTRING(node).s; p < NSTRING(node).end; p++) fputc(*p, f);
+ for (p = NSTRING(node).s; p < NSTRING(node).end; p++) {
+ if (*p >= 0x20 && *p < 0x7f)
+ fputc(*p, f);
+ else {
+ fprintf(f, " 0x%02x", *p);
+ }
+ }
break;
case N_CCLASS:
switch (NCTYPE(node).type) {
case CTYPE_WORD: fputs("word", f); break;
case CTYPE_NOT_WORD: fputs("not word", f); break;
-#ifdef USE_SBMB_CLASS
- case CTYPE_WORD_SB: fputs("word-sb", f); break;
- case CTYPE_WORD_MB: fputs("word-mb", f); break;
-#endif
default:
fprintf(f, "ERROR: undefined ctype.\n");
exit(0);
fprintf(f, "\n");
fflush(f);
}
+#endif /* ONIG_DEBUG */
+#ifdef ONIG_DEBUG_PARSE_TREE
static void
print_tree(FILE* f, Node* node)
{
print_indent_tree(f, node, 0);
}
-#endif /* REG_DEBUG */
+#endif
--- /dev/null
+/**********************************************************************
+
+ regenc.c - Oniguruma (regular expression library)
+
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
+
+**********************************************************************/
+#include "regenc.h"
+
+OnigEncoding OnigEncDefaultCharEncoding = ONIG_ENCODING_INIT_DEFAULT;
+
+extern int
+onigenc_init()
+{
+ return 0;
+}
+
+extern OnigEncoding
+onigenc_get_default_encoding()
+{
+ return OnigEncDefaultCharEncoding;
+}
+
+extern int
+onigenc_set_default_encoding(OnigEncoding enc)
+{
+ OnigEncDefaultCharEncoding = enc;
+ return 0;
+}
+
+extern UChar*
+onigenc_get_right_adjust_char_head(OnigEncoding enc, UChar* start, UChar* s)
+{
+ UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);
+ if (p < s) {
+ p += enc_len(enc, *p);
+ }
+ return p;
+}
+
+extern UChar*
+onigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc,
+ UChar* start, UChar* s, UChar** prev)
+{
+ UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);
+
+ if (p < s) {
+ if (prev) *prev = p;
+ p += enc_len(enc, *p);
+ }
+ else {
+ if (prev) *prev = (UChar* )NULL; /* Sorry */
+ }
+ return p;
+}
+
+extern UChar*
+onigenc_get_prev_char_head(OnigEncoding enc, UChar* start, UChar* s)
+{
+ if (s <= start)
+ return (UChar* )NULL;
+
+ return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);
+}
+
+extern UChar*
+onigenc_step_back(OnigEncoding enc, UChar* start, UChar* s, int n)
+{
+ while (ONIG_IS_NOT_NULL(s) && n-- > 0) {
+ if (s <= start)
+ return (UChar* )NULL;
+
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);
+ }
+ return s;
+}
+
+
+#ifndef ONIG_RUBY_M17N
+
+#ifndef NOT_RUBY
+#define USE_APPLICATION_TO_LOWER_CASE_TABLE
+#endif
+
+UChar* OnigEncAsciiToLowerCaseTable = (UChar* )0;
+
+#ifndef USE_APPLICATION_TO_LOWER_CASE_TABLE
+static UChar BuiltInAsciiToLowerCaseTable[] = {
+ '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+ '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+ '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+ '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+ '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+ '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+ '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+ '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+ '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+ '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+ '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+ '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+ '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+ '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+ '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+ '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+ '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+ '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+ '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+ '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+ '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+ '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+ '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+ '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+ '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
+ '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
+ '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
+ '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
+ '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+ '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+ '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+ '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+#endif /* not USE_APPLICATION_TO_LOWER_CASE_TABLE */
+
+unsigned short OnigEncAsciiCtypeTable[256] = {
+ 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004,
+ 0x1004, 0x1106, 0x1104, 0x1104, 0x1104, 0x1104, 0x1004, 0x1004,
+ 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004,
+ 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004,
+ 0x1142, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0,
+ 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0,
+ 0x1c58, 0x1c58, 0x1c58, 0x1c58, 0x1c58, 0x1c58, 0x1c58, 0x1c58,
+ 0x1c58, 0x1c58, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x10d0,
+ 0x10d0, 0x1e51, 0x1e51, 0x1e51, 0x1e51, 0x1e51, 0x1e51, 0x1a51,
+ 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51,
+ 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51, 0x1a51,
+ 0x1a51, 0x1a51, 0x1a51, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x18d0,
+ 0x10d0, 0x1c71, 0x1c71, 0x1c71, 0x1c71, 0x1c71, 0x1c71, 0x1871,
+ 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871,
+ 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871, 0x1871,
+ 0x1871, 0x1871, 0x1871, 0x10d0, 0x10d0, 0x10d0, 0x10d0, 0x1004,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+extern void
+onigenc_set_default_caseconv_table(UChar* table)
+{
+ if (table == (UChar* )0) {
+#ifndef USE_APPLICATION_TO_LOWER_CASE_TABLE
+ table = BuiltInAsciiToLowerCaseTable;
+#else
+ return ;
+#endif
+ }
+
+ if (table != OnigEncAsciiToLowerCaseTable) {
+ OnigEncAsciiToLowerCaseTable = table;
+ }
+}
+
+extern UChar*
+onigenc_get_left_adjust_char_head(OnigEncoding enc, UChar* start, UChar* s)
+{
+ return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);
+}
+
+extern int
+onigenc_nothing_get_all_fold_match_code(OnigCodePoint** codes)
+{
+ return 0;
+}
+
+extern int
+onigenc_nothing_get_fold_match_info(UChar* p, UChar* end,
+ OnigEncFoldMatchInfo** info)
+{
+ return -1;
+}
+
+extern int
+onigenc_nothing_get_ctype_code_range(int ctype, int* nsb, int* nmb,
+ OnigCodePointRange* sbr[], OnigCodePointRange* mbr[])
+{
+ return -1;
+}
+
+/* for single byte encodings */
+extern int
+onigenc_ascii_mbc_to_lower(UChar* p, UChar* lower)
+{
+ *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);
+ return 1; /* return byte length of converted char to lower */
+}
+
+extern int
+onigenc_ascii_mbc_is_case_ambig(UChar* p)
+{
+ return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);
+}
+
+extern OnigCodePoint
+onigenc_single_byte_mbc_to_code(UChar* p, UChar* end)
+{
+ return (OnigCodePoint )(*p);
+}
+
+extern int
+onigenc_single_byte_code_to_mbclen(OnigCodePoint code)
+{
+ return 1;
+}
+
+extern int
+onigenc_single_byte_code_to_mbc_first(OnigCodePoint code)
+{
+ return (code & 0xff);
+}
+
+extern int
+onigenc_single_byte_code_to_mbc(OnigCodePoint code, UChar *buf)
+{
+ *buf = (code & 0xff);
+ return 1;
+}
+
+extern UChar*
+onigenc_single_byte_left_adjust_char_head(UChar* start, UChar* s)
+{
+ return s;
+}
+
+extern int
+onigenc_single_byte_is_allowed_reverse_match(UChar* s, UChar* end)
+{
+ return TRUE;
+}
+
+extern OnigCodePoint
+onigenc_mbn_mbc_to_code(OnigEncoding enc, UChar* p, UChar* end)
+{
+ int c, i, len;
+ OnigCodePoint n;
+
+ c = *p++;
+ len = enc_len(enc, c);
+ n = c;
+ if (len == 1) return n;
+
+ for (i = 1; i < len; i++) {
+ if (p >= end) break;
+ c = *p++;
+ n <<= 8; n += c;
+ }
+ return n;
+}
+
+extern int
+onigenc_mbn_mbc_to_lower(OnigEncoding enc, UChar* p, UChar* lower)
+{
+ int len;
+
+ if (ONIGENC_IS_MBC_ASCII(p)) {
+ *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);
+ return 1;
+ }
+ else {
+ len = enc_len(enc, *p);
+ if (lower != p) {
+ /* memcpy(lower, p, len); */
+ int i;
+ for (i = 0; i < len; i++) {
+ *lower++ = *p++;
+ }
+ }
+ return len; /* return byte length of converted to lower char */
+ }
+}
+
+extern int
+onigenc_mbn_mbc_is_case_ambig(UChar* p)
+{
+ if (ONIGENC_IS_MBC_ASCII(p))
+ return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);
+
+ return FALSE;
+}
+
+extern int
+onigenc_mb2_code_to_mbclen(OnigCodePoint code)
+{
+ if ((code & 0xff00) != 0) return 2;
+ else return 1;
+}
+
+extern int
+onigenc_mb4_code_to_mbclen(OnigCodePoint code)
+{
+ if ((code & 0xff000000) != 0) return 4;
+ else if ((code & 0xff0000) != 0) return 3;
+ else if ((code & 0xff00) != 0) return 2;
+ else return 1;
+}
+
+extern int
+onigenc_mb2_code_to_mbc_first(OnigCodePoint code)
+{
+ int first;
+
+ if ((code & 0xff00) != 0) {
+ first = (code >> 8) & 0xff;
+ }
+ else {
+ return (int )code;
+ }
+ return first;
+}
+
+extern int
+onigenc_mb4_code_to_mbc_first(OnigCodePoint code)
+{
+ int first;
+
+ if ((code & 0xff000000) != 0) {
+ first = (code >> 24) & 0xff;
+ }
+ else if ((code & 0xff0000) != 0) {
+ first = (code >> 16) & 0xff;
+ }
+ else if ((code & 0xff00) != 0) {
+ first = (code >> 8) & 0xff;
+ }
+ else {
+ return (int )code;
+ }
+ return first;
+}
+
+extern int
+onigenc_mb2_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)
+{
+ UChar *p = buf;
+
+ if ((code & 0xff00) != 0) {
+ *p++ = ((code >> 8) & 0xff);
+ }
+ *p++ = (code & 0xff);
+
+#if 1
+ if (enc_len(enc, buf[0]) != (p - buf))
+ return ONIGERR_INVALID_WIDE_CHAR_VALUE;
+#endif
+ return p - buf;
+}
+
+extern int
+onigenc_mb4_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)
+{
+ UChar *p = buf;
+
+ if ((code & 0xff000000) != 0) {
+ *p++ = ((code >> 24) & 0xff);
+ }
+ if ((code & 0xff0000) != 0) {
+ *p++ = ((code >> 16) & 0xff);
+ }
+ if ((code & 0xff00) != 0) {
+ *p++ = ((code >> 8) & 0xff);
+ }
+ *p++ = (code & 0xff);
+
+#if 1
+ if (enc_len(enc, buf[0]) != (p - buf))
+ return ONIGERR_INVALID_WIDE_CHAR_VALUE;
+#endif
+ return p - buf;
+}
+
+extern int
+onigenc_mb2_code_is_ctype(OnigEncoding enc, OnigCodePoint code,
+ unsigned int ctype)
+{
+ if ((ctype & ONIGENC_CTYPE_WORD) != 0) {
+ if (code < 128)
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);
+ else {
+ int first = onigenc_mb2_code_to_mbc_first(code);
+ return (enc_len(enc, first) > 1 ? TRUE : FALSE);
+ }
+
+ ctype &= ~ONIGENC_CTYPE_WORD;
+ if (ctype == 0) return FALSE;
+ }
+
+ if (code < 128)
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);
+ else
+ return FALSE;
+}
+
+extern int
+onigenc_mb4_code_is_ctype(OnigEncoding enc, OnigCodePoint code,
+ unsigned int ctype)
+{
+ if ((ctype & ONIGENC_CTYPE_WORD) != 0) {
+ if (code < 128)
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);
+ else {
+ int first = onigenc_mb4_code_to_mbc_first(code);
+ return (enc_len(enc, first) > 1 ? TRUE : FALSE);
+ }
+
+ ctype &= ~ONIGENC_CTYPE_WORD;
+ if (ctype == 0) return FALSE;
+ }
+
+ if (code < 128)
+ return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);
+ else
+ return FALSE;
+}
+
+extern int
+onigenc_get_all_fold_match_code_ss_0xdf(OnigCodePoint** codes)
+{
+ static OnigCodePoint list[] = { 0xdf };
+ *codes = list;
+ return 1;
+}
+
+extern int
+onigenc_get_fold_match_info_ss_0xdf(UChar* p, UChar* end,
+ OnigEncFoldMatchInfo** info)
+{
+ /* German alphabet ess-tsett(U+00DF) */
+ static OnigEncFoldMatchInfo ss = {
+ 3,
+ { 1, 2, 2 },
+ { "\337", "ss", "SS" } /* 0337: 0xdf */
+ };
+
+ if (p >= end) return -1;
+
+ if (*p == 0xdf) {
+ *info = &ss;
+ return 1;
+ }
+ else if (p + 1 < end) {
+ if ((*p == 'S' && *(p+1) == 'S') ||
+ (*p == 's' && *(p+1) == 's')) {
+ *info = &ss;
+ return 2;
+ }
+ }
+
+ return -1; /* is not a fold string. */
+}
+
+#else /* ONIG_RUBY_M17N */
+
+extern int
+onigenc_is_code_ctype(OnigEncoding enc, OnigCodePoint code, int ctype)
+{
+ switch (ctype) {
+ case ONIGENC_CTYPE_ALPHA:
+ return m17n_isalpha(enc, code);
+ break;
+ case ONIGENC_CTYPE_BLANK:
+ return ONIGENC_IS_CODE_BLANK(enc, (int )(code));
+ break;
+ case ONIGENC_CTYPE_CNTRL:
+ return m17n_iscntrl(enc, code);
+ break;
+ case ONIGENC_CTYPE_DIGIT:
+ return m17n_isdigit(enc, code);
+ break;
+ case ONIGENC_CTYPE_GRAPH:
+ return ONIGENC_IS_CODE_GRAPH(enc, (int )(code));
+ break;
+ case ONIGENC_CTYPE_LOWER:
+ return m17n_islower(enc, code);
+ break;
+ case ONIGENC_CTYPE_PRINT:
+ return m17n_isprint(enc, code);
+ break;
+ case ONIGENC_CTYPE_PUNCT:
+ return m17n_ispunct(enc, code);
+ break;
+ case ONIGENC_CTYPE_SPACE:
+ return m17n_isspace(enc, code);
+ break;
+ case ONIGENC_CTYPE_UPPER:
+ return m17n_isupper(enc, code);
+ break;
+ case ONIGENC_CTYPE_XDIGIT:
+ return m17n_isxdigit(enc, code);
+ break;
+ case ONIGENC_CTYPE_WORD:
+ return m17n_iswchar(enc, code);
+ break;
+ case ONIGENC_CTYPE_ASCII:
+ return (code < 128 ? TRUE : FALSE);
+ break;
+ case ONIGENC_CTYPE_ALNUM:
+ return m17n_isalnum(enc, code);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+extern int
+onigenc_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)
+{
+ int c, len;
+
+ m17n_mbcput(enc, code, buf);
+ c = m17n_firstbyte(enc, code);
+ len = enc_len(enc, c);
+ return len;
+}
+
+extern int
+onigenc_mbc_to_lower(OnigEncoding enc, UChar* p, UChar* buf)
+{
+ unsigned int c, low;
+
+ c = m17n_codepoint(enc, p, p + enc_len(enc, *p));
+ low = m17n_tolower(enc, c);
+ m17n_mbcput(enc, low, buf);
+
+ return m17n_codelen(enc, low);
+}
+
+extern int
+onigenc_mbc_is_case_ambig(OnigEncoding enc, UChar* p)
+{
+ unsigned int c = m17n_codepoint(enc, p, p + enc_len(enc, *p));
+
+ if (m17n_isupper(enc, c) || m17n_islower(enc, c))
+ return TRUE;
+ return FALSE;
+}
+
+extern UChar*
+onigenc_get_left_adjust_char_head(OnigEncoding enc, UChar* start, UChar* s)
+{
+ UChar *p;
+ int len;
+
+ if (s <= start) return s;
+ p = s;
+
+ while (!m17n_islead(enc, *p) && p > start) p--;
+ while (p + (len = enc_len(enc, *p)) < s) {
+ p += len;
+ }
+ if (p + len == s) return s;
+ return p;
+}
+
+extern int
+onigenc_is_allowed_reverse_match(OnigEncoding enc, UChar* s, UChar* end)
+{
+ return ONIGENC_IS_SINGLEBYTE(enc);
+}
+
+extern void
+onigenc_set_default_caseconv_table(UChar* table) { }
+
+#endif /* ONIG_RUBY_M17N */
--- /dev/null
+/**********************************************************************
+
+ regenc.h - Oniguruma (regular expression library)
+
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
+
+**********************************************************************/
+#ifndef REGENC_H
+#define REGENC_H
+
+#ifndef ONIG_SOURCE_IS_WRAPPED
+#include "config.h"
+#endif
+
+#include "oniguruma.h"
+
+#ifndef NULL
+#define NULL ((void* )0)
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/* error codes */
+/* internal error */
+#define ONIGERR_MEMORY -5
+#define ONIGERR_TYPE_BUG -6
+/* syntax error [-400, -999] */
+#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400
+#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401
+
+#define ONIG_NEWLINE '\n'
+#define ONIG_IS_NEWLINE(c) ((c) == ONIG_NEWLINE)
+#define ONIG_IS_NULL(p) (((void*)(p)) == (void*)0)
+#define ONIG_IS_NOT_NULL(p) (((void*)(p)) != (void*)0)
+#define ONIG_CHECK_NULL_RETURN(p) if (ONIG_IS_NULL(p)) return NULL
+#define ONIG_CHECK_NULL_RETURN_VAL(p,val) if (ONIG_IS_NULL(p)) return (val)
+
+
+#ifdef ONIG_RUBY_M17N
+
+#define ONIG_ENCODING_INIT_DEFAULT ONIG_ENCODING_UNDEF
+
+#else /* ONIG_RUBY_M17N */
+
+#define ONIG_ENCODING_INIT_DEFAULT ONIG_ENCODING_ASCII
+
+/* for encoding system implementation (internal) */
+ONIG_EXTERN int onigenc_nothing_get_all_fold_match_code P_((OnigCodePoint** codes));
+ONIG_EXTERN int onigenc_nothing_get_fold_match_info P_((UChar* p, UChar* end, OnigEncFoldMatchInfo** info));
+ONIG_EXTERN int onigenc_nothing_get_ctype_code_range P_((int ctype, int* nsb, int* nmb, OnigCodePointRange* sbr[], OnigCodePointRange* mbr[]));
+
+/* methods for single byte encoding */
+ONIG_EXTERN int onigenc_ascii_mbc_to_lower P_((UChar* p, UChar* lower));
+ONIG_EXTERN int onigenc_ascii_mbc_is_case_ambig P_((UChar* p));
+ONIG_EXTERN OnigCodePoint onigenc_single_byte_mbc_to_code P_((UChar* p, UChar* end));
+ONIG_EXTERN int onigenc_single_byte_code_to_mbclen P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_single_byte_code_to_mbc_first P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_single_byte_code_to_mbc P_((OnigCodePoint code, UChar *buf));
+ONIG_EXTERN UChar* onigenc_single_byte_left_adjust_char_head P_((UChar* start, UChar* s));
+ONIG_EXTERN int onigenc_single_byte_is_allowed_reverse_match P_((UChar* s, UChar* end));
+
+/* methods for multi byte encoding */
+ONIG_EXTERN OnigCodePoint onigenc_mbn_mbc_to_code P_((OnigEncoding enc, UChar* p, UChar* end));
+ONIG_EXTERN int onigenc_mbn_mbc_to_lower P_((OnigEncoding enc, UChar* p, UChar* lower));
+ONIG_EXTERN int onigenc_mbn_mbc_is_case_ambig P_((UChar* p));
+ONIG_EXTERN int onigenc_mb2_code_to_mbclen P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_mb2_code_to_mbc_first P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_mb2_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));
+ONIG_EXTERN int onigenc_mb2_code_is_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));
+ONIG_EXTERN int onigenc_mb4_code_to_mbclen P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_mb4_code_to_mbc_first P_((OnigCodePoint code));
+ONIG_EXTERN int onigenc_mb4_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));
+ONIG_EXTERN int onigenc_mb4_code_is_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));
+
+ONIG_EXTERN int onigenc_get_all_fold_match_code_ss_0xdf P_((OnigCodePoint** codes));
+ONIG_EXTERN int onigenc_get_fold_match_info_ss_0xdf P_((UChar* p, UChar* end, OnigEncFoldMatchInfo** info));
+
+#endif /* is not ONIG_RUBY_M17N */
+
+
+ONIG_EXTERN OnigEncoding OnigEncDefaultCharEncoding;
+ONIG_EXTERN UChar* OnigEncAsciiToLowerCaseTable;
+ONIG_EXTERN unsigned short OnigEncAsciiCtypeTable[];
+
+#define ONIGENC_ASCII_CODE_TO_LOWER_CASE(c) OnigEncAsciiToLowerCaseTable[c]
+#define ONIGENC_IS_ASCII_CODE_CTYPE(code,ctype) \
+ ((OnigEncAsciiCtypeTable[code] & ctype) != 0)
+#define ONIGENC_IS_ASCII_CODE_CASE_AMBIG(code) \
+ ONIGENC_IS_ASCII_CODE_CTYPE(code, (ONIGENC_CTYPE_UPPER | ONIGENC_CTYPE_LOWER))
+
+#endif /* REGENC_H */
regerror.c - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "regint.h"
#endif
extern char*
-regex_error_code_to_format(int code)
+onig_error_code_to_format(int code)
{
char *p;
if (code >= 0) return (char* )0;
switch (code) {
- case REG_MISMATCH:
+ case ONIG_MISMATCH:
p = "mismatch"; break;
- case REG_NO_SUPPORT_CONFIG:
+ case ONIG_NO_SUPPORT_CONFIG:
p = "no support in this configuration"; break;
- case REGERR_MEMORY:
+ case ONIGERR_MEMORY:
p = "fail to memory allocation"; break;
- case REGERR_MATCH_STACK_LIMIT_OVER:
+ case ONIGERR_MATCH_STACK_LIMIT_OVER:
p = "match-stack limit over"; break;
- case REGERR_TYPE_BUG:
+ case ONIGERR_TYPE_BUG:
p = "undefined type (bug)"; break;
- case REGERR_PARSER_BUG:
+ case ONIGERR_PARSER_BUG:
p = "internal parser error (bug)"; break;
- case REGERR_STACK_BUG:
+ case ONIGERR_STACK_BUG:
p = "stack error (bug)"; break;
- case REGERR_UNDEFINED_BYTECODE:
+ case ONIGERR_UNDEFINED_BYTECODE:
p = "undefined bytecode (bug)"; break;
- case REGERR_UNEXPECTED_BYTECODE:
+ case ONIGERR_UNEXPECTED_BYTECODE:
p = "unexpected bytecode (bug)"; break;
- case REGERR_DEFAULT_ENCODING_IS_NOT_SETTED:
+ case ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED:
p = "default multibyte-encoding is not setted"; break;
- case REGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:
+ case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:
p = "can't convert to wide-char on specified multibyte-encoding"; break;
- case REGERR_END_PATTERN_AT_LEFT_BRACE:
+ case ONIGERR_INVALID_ARGUMENT:
+ p = "invalid argument"; break;
+ case ONIGERR_END_PATTERN_AT_LEFT_BRACE:
p = "end pattern at left brace"; break;
- case REGERR_END_PATTERN_AT_LEFT_BRACKET:
+ case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:
p = "end pattern at left bracket"; break;
- case REGERR_EMPTY_CHAR_CLASS:
+ case ONIGERR_EMPTY_CHAR_CLASS:
p = "empty char-class"; break;
- case REGERR_PREMATURE_END_OF_CHAR_CLASS:
+ case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:
p = "premature end of char-class"; break;
- case REGERR_END_PATTERN_AT_BACKSLASH:
+ case ONIGERR_END_PATTERN_AT_BACKSLASH:
p = "end pattern at backslash"; break;
- case REGERR_END_PATTERN_AT_META:
+ case ONIGERR_END_PATTERN_AT_META:
p = "end pattern at meta"; break;
- case REGERR_END_PATTERN_AT_CONTROL:
+ case ONIGERR_END_PATTERN_AT_CONTROL:
p = "end pattern at control"; break;
- case REGERR_META_CODE_SYNTAX:
+ case ONIGERR_META_CODE_SYNTAX:
p = "illegal meta-code syntax"; break;
- case REGERR_CONTROL_CODE_SYNTAX:
+ case ONIGERR_CONTROL_CODE_SYNTAX:
p = "illegal control-code syntax"; break;
- case REGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:
+ case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:
p = "char-class value at end of range"; break;
- case REGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:
+ case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:
p = "char-class value at start of range"; break;
- case REGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:
+ case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:
p = "unmatched range specifier in char-class"; break;
- case REGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:
+ case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:
p = "target of repeat operator is not specified"; break;
- case REGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:
+ case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:
p = "target of repeat operator is invalid"; break;
- case REGERR_NESTED_REPEAT_OPERATOR:
+ case ONIGERR_NESTED_REPEAT_OPERATOR:
p = "nested repeat operator"; break;
- case REGERR_UNMATCHED_CLOSE_PARENTHESIS:
+ case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:
p = "unmatched close parenthesis"; break;
- case REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:
+ case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:
p = "end pattern with unmatched parenthesis"; break;
- case REGERR_END_PATTERN_IN_GROUP:
+ case ONIGERR_END_PATTERN_IN_GROUP:
p = "end pattern in group"; break;
- case REGERR_UNDEFINED_GROUP_OPTION:
+ case ONIGERR_UNDEFINED_GROUP_OPTION:
p = "undefined group option"; break;
- case REGERR_INVALID_POSIX_BRACKET_TYPE:
+ case ONIGERR_INVALID_POSIX_BRACKET_TYPE:
p = "invalid POSIX bracket type"; break;
- case REGERR_INVALID_LOOK_BEHIND_PATTERN:
+ case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:
p = "invalid pattern in look-behind"; break;
- case REGERR_INVALID_REPEAT_RANGE_PATTERN:
+ case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:
p = "invalid repeat range {lower,upper}"; break;
- case REGERR_TOO_BIG_NUMBER:
+ case ONIGERR_TOO_BIG_NUMBER:
p = "too big number"; break;
- case REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:
+ case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:
p = "too big number for repeat range"; break;
- case REGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:
+ case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:
p = "upper is smaller than lower in repeat range"; break;
- case REGERR_EMPTY_RANGE_IN_CHAR_CLASS:
+ case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:
p = "empty range in char class"; break;
- case REGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:
+ case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:
p = "mismatch multibyte code length in char-class range"; break;
- case REGERR_TOO_MANY_MULTI_BYTE_RANGES:
+ case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:
p = "too many multibyte code ranges are specified"; break;
- case REGERR_TOO_SHORT_MULTI_BYTE_STRING:
+ case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:
p = "too short multibyte code string"; break;
- case REGERR_TOO_BIG_BACKREF_NUMBER:
+ case ONIGERR_TOO_BIG_BACKREF_NUMBER:
p = "too big backref number"; break;
- case REGERR_INVALID_BACKREF:
-#ifdef USE_NAMED_SUBEXP
+ case ONIGERR_INVALID_BACKREF:
+#ifdef USE_NAMED_GROUP
p = "invalid backref number/name"; break;
#else
p = "invalid backref number"; break;
#endif
- case REGERR_TOO_BIG_WIDE_CHAR_VALUE:
+ case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:
+ p = "numbered backref/call is not allowed. (use name)"; break;
+ case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:
p = "too big wide-char value"; break;
- case REGERR_TOO_LONG_WIDE_CHAR_VALUE:
+ case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:
p = "too long wide-char value"; break;
- case REGERR_INVALID_WIDE_CHAR_VALUE:
+ case ONIGERR_INVALID_WIDE_CHAR_VALUE:
p = "invalid wide-char value"; break;
- case REGERR_INVALID_SUBEXP_NAME:
- p = "invalid subexp name"; break;
- case REGERR_UNDEFINED_NAME_REFERENCE:
+ case ONIGERR_EMPTY_GROUP_NAME:
+ p = "group name is empty"; break;
+ case ONIGERR_INVALID_GROUP_NAME:
+ p = "invalid group name <%n>"; break;
+ case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:
+#ifdef USE_NAMED_GROUP
+ p = "invalid char in group name <%n>"; break;
+#else
+ p = "invalid char in group number <%n>"; break;
+#endif
+ case ONIGERR_UNDEFINED_NAME_REFERENCE:
p = "undefined name <%n> reference"; break;
- case REGERR_UNDEFINED_GROUP_REFERENCE:
- p = "undefined group reference"; break;
- case REGERR_MULTIPLEX_DEFINITION_NAME_CALL:
+ case ONIGERR_UNDEFINED_GROUP_REFERENCE:
+ p = "undefined group <%n> reference"; break;
+ case ONIGERR_MULTIPLEX_DEFINED_NAME:
+ p = "multiplex defined name <%n>"; break;
+ case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:
p = "multiplex definition name <%n> call"; break;
- case REGERR_NEVER_ENDING_RECURSION:
+ case ONIGERR_NEVER_ENDING_RECURSION:
p = "never ending recursion"; break;
- case REGERR_OVER_THREAD_PASS_LIMIT_COUNT:
+ case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:
+ p = "group number is too big for capture history"; break;
+ case ONIGERR_INVALID_CHAR_PROPERTY_NAME:
+ p = "invalid character property name"; break;
+ case ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT:
p = "over thread pass limit count"; break;
default:
}
-/* for REG_MAX_ERROR_MESSAGE_LEN */
+/* for ONIG_MAX_ERROR_MESSAGE_LEN */
#define MAX_ERROR_PAR_LEN 30
extern int
#ifdef HAVE_STDARG_PROTOTYPES
-regex_error_code_to_str(UChar* s, int code, ...)
+onig_error_code_to_str(UChar* s, int code, ...)
#else
-regex_error_code_to_str(UChar* s, code, va_alist)
+onig_error_code_to_str(s, code, va_alist)
+ UChar* s;
int code;
va_dcl
#endif
{
UChar *p, *q;
- RegErrorInfo* einfo;
+ OnigErrorInfo* einfo;
int len;
va_list vargs;
va_init_list(vargs, code);
switch (code) {
- case REGERR_UNDEFINED_NAME_REFERENCE:
- case REGERR_MULTIPLEX_DEFINITION_NAME_CALL:
- einfo = va_arg(vargs, RegErrorInfo*);
+ case ONIGERR_UNDEFINED_NAME_REFERENCE:
+ case ONIGERR_UNDEFINED_GROUP_REFERENCE:
+ case ONIGERR_MULTIPLEX_DEFINED_NAME:
+ case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:
+ case ONIGERR_INVALID_GROUP_NAME:
+ case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:
+ einfo = va_arg(vargs, OnigErrorInfo*);
len = einfo->par_end - einfo->par;
- q = regex_error_code_to_format(code);
+ q = onig_error_code_to_format(code);
p = s;
while (*q != '\0') {
if (*q == '%') {
break;
default:
- q = regex_error_code_to_format(code);
+ q = onig_error_code_to_format(code);
len = strlen(q);
xmemcpy(s, q, len);
s[len] = '\0';
void
#ifdef HAVE_STDARG_PROTOTYPES
-regex_snprintf_with_pattern(char buf[], int bufsize, RegCharEncoding enc,
+onig_snprintf_with_pattern(char buf[], int bufsize, OnigEncoding enc,
char* pat, char* pat_end, char *fmt, ...)
#else
-regex_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)
+onig_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)
char buf[];
int bufsize;
- RegCharEncoding enc;
+ OnigEncoding enc;
char* pat;
char* pat_end;
const char *fmt;
#endif
{
int n, need, len;
- char *p, *s;
+ UChar *p, *s;
va_list args;
va_init_list(args, fmt);
s = buf + strlen(buf);
p = pat;
- while (p < pat_end) {
- if (*p == '\\') {
+ while (p < (UChar* )pat_end) {
+ if (*p == MC_ESC) {
*s++ = *p++;
- len = mblen(enc, *p);
+ len = enc_len(enc, *p);
while (len-- > 0) *s++ = *p++;
}
else if (*p == '/') {
- *s++ = '\\';
+ *s++ = MC_ESC;
*s++ = *p++;
}
- else if (ismb(enc, *p)) {
- len = mblen(enc, *p);
+ else if (ONIGENC_IS_MBC_HEAD(enc, *p)) {
+ len = enc_len(enc, *p);
while (len-- > 0) *s++ = *p++;
}
- else if (!IS_PRINT(*p) && !IS_SPACE(*p)) {
+ else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&
+ !ONIGENC_IS_CODE_SPACE(enc, *p)) {
char b[5];
sprintf(b, "\\%03o", *p & 0377);
len = strlen(b);
regex.c - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
/*
* Source wrapper for Ruby.
*/
+#define ONIG_SOURCE_IS_WRAPPED
+
+#include "regint.h"
+#include "regex.h"
#include "regparse.c"
#include "regcomp.c"
#include "regexec.c"
+#include "regenc.c"
#include "reggnu.c"
#include "regerror.c"
+
+#ifndef ONIG_RUBY_M17N
+#include "enc/ascii.c"
+#include "enc/utf8.c"
+#include "enc/euc_jp.c"
+#include "enc/sjis.c"
+#endif
regexec.c - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "regint.h"
-static UChar*
-get_right_adjust_char_head_with_prev(RegCharEncoding code,
- UChar* start, UChar* s, UChar** prev);
-static UChar*
-step_backward_char(RegCharEncoding code, UChar* start, UChar* s, int n);
+static void
+region_list_clear(OnigRegion** list)
+{
+ int i;
+ if (IS_NOT_NULL(list)) {
+ for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
+ if (IS_NOT_NULL(list[i])) {
+ xfree(list[i]);
+ list[i] = (OnigRegion* )0;
+ }
+ }
+ }
+}
+
+static void
+region_list_free(OnigRegion* r)
+{
+ if (IS_NOT_NULL(r->list)) {
+ region_list_clear(r->list);
+ xfree(r->list);
+ r->list = (OnigRegion** )0;
+ }
+}
+
+static OnigRegion**
+region_list_new()
+{
+ int i;
+ OnigRegion** list;
+
+ list = (OnigRegion** )xmalloc(sizeof(OnigRegion*)
+ * (ONIG_MAX_CAPTURE_HISTORY_GROUP + 1));
+ CHECK_NULL_RETURN(list);
+ for (i = 0; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
+ list[i] = (OnigRegion* )0;
+ }
+
+ return list;
+}
extern void
-regex_region_clear(RegRegion* region)
+onig_region_clear(OnigRegion* region)
{
int i;
for (i = 0; i < region->num_regs; i++) {
- region->beg[i] = region->end[i] = REG_REGION_NOTPOS;
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
}
+ region_list_clear(region->list);
}
extern int
-regex_region_resize(RegRegion* region, int n)
+onig_region_resize(OnigRegion* region, int n)
{
int i;
region->num_regs = n;
- if (n < REG_NREGION)
- n = REG_NREGION;
+ if (n < ONIG_NREGION)
+ n = ONIG_NREGION;
if (region->allocated == 0) {
region->beg = (int* )xmalloc(n * sizeof(int));
region->end = (int* )xmalloc(n * sizeof(int));
if (region->beg == 0 || region->end == 0)
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
region->allocated = n;
}
region->end = (int* )xrealloc(region->end, n * sizeof(int));
if (region->beg == 0 || region->end == 0)
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
region->allocated = n;
}
for (i = 0; i < region->num_regs; i++) {
- region->beg[i] = region->end[i] = REG_REGION_NOTPOS;
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
+ }
+
+ if (IS_NOT_NULL(region->list))
+ region_list_clear(region->list);
+
+ return 0;
+}
+
+static int
+region_ensure_size(OnigRegion* region, int n)
+{
+ int i, new_size;
+
+ if (region->allocated >= n)
+ return 0;
+
+ new_size = region->allocated;
+ if (new_size == 0)
+ new_size = ONIG_NREGION;
+ while (new_size < n)
+ new_size *= 2;
+
+ if (region->allocated == 0) {
+ region->beg = (int* )xmalloc(new_size * sizeof(int));
+ region->end = (int* )xmalloc(new_size * sizeof(int));
+ if (region->beg == 0 || region->end == 0)
+ return ONIGERR_MEMORY;
+
+ region->allocated = new_size;
+ }
+ else if (region->allocated < new_size) {
+ region->beg = (int* )xrealloc(region->beg, new_size * sizeof(int));
+ region->end = (int* )xrealloc(region->end, new_size * sizeof(int));
+ if (region->beg == 0 || region->end == 0)
+ return ONIGERR_MEMORY;
+
+ region->allocated = new_size;
+ }
+
+ for (i = region->num_regs; i < n; i++) {
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
}
return 0;
}
+static int
+region_list_add_entry(OnigRegion* region, int group, int start, int end)
+{
+ int r, pos;
+ OnigRegion** list;
+
+ if (group > ONIG_MAX_CAPTURE_HISTORY_GROUP)
+ return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;
+
+ if (IS_NULL(region->list)) {
+ region->list = region_list_new();
+ CHECK_NULL_RETURN_VAL(region->list, ONIGERR_MEMORY);
+ }
+
+ list = region->list;
+ if (IS_NULL(list[group])) {
+ list[group] = onig_region_new();
+ CHECK_NULL_RETURN_VAL(list[group], ONIGERR_MEMORY);
+ }
+
+ r = region_ensure_size(list[group], list[group]->num_regs + 1);
+ if (r != 0) return r;
+
+ pos = list[group]->num_regs;
+ list[group]->beg[pos] = start;
+ list[group]->end[pos] = end;
+ list[group]->num_regs++;
+
+ return 0;
+}
+
static void
-regex_region_init(RegRegion* region)
+onig_region_init(OnigRegion* region)
{
region->num_regs = 0;
region->allocated = 0;
region->beg = (int* )0;
region->end = (int* )0;
+ region->list = (OnigRegion** )0;
}
-extern RegRegion*
-regex_region_new()
+extern OnigRegion*
+onig_region_new()
{
- RegRegion* r;
+ OnigRegion* r;
- r = (RegRegion* )xmalloc(sizeof(RegRegion));
- regex_region_init(r);
+ r = (OnigRegion* )xmalloc(sizeof(OnigRegion));
+ onig_region_init(r);
return r;
}
extern void
-regex_region_free(RegRegion* r, int free_self)
+onig_region_free(OnigRegion* r, int free_self)
{
if (r) {
if (r->allocated > 0) {
if (r->end) xfree(r->end);
r->allocated = 0;
}
+ region_list_free(r);
if (free_self) xfree(r);
}
}
extern void
-regex_region_copy(RegRegion* to, RegRegion* from)
+onig_region_copy(OnigRegion* to, OnigRegion* from)
{
#define RREGC_SIZE (sizeof(int) * from->num_regs)
int i;
to->end[i] = from->end[i];
}
to->num_regs = from->num_regs;
+
+ if (IS_NOT_NULL(from->list)) {
+ if (IS_NULL(to->list)) {
+ to->list = region_list_new();
+ }
+
+ for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
+ if (IS_NOT_NULL(from->list[i])) {
+ if (IS_NULL(to->list[i]))
+ to->list[i] = onig_region_new();
+
+ onig_region_copy(to->list[i], from->list[i]);
+ }
+ else {
+ if (IS_NOT_NULL(to->list[i])) {
+ xfree(to->list[i]);
+ to->list[i] = (OnigRegion* )0;
+ }
+ }
+ }
+ }
+ else
+ region_list_free(to);
}
#define STK_MEM_END 0x0300
#define STK_REPEAT_INC 0x0400
/* avoided by normal-POP */
-#define STK_POS 0x0500 /* used when POP-POS */
-#define STK_STOP_BT 0x0600 /* mark for "(?>...)" */
+#define STK_POS 0x0500 /* used when POP-POS */
+#define STK_STOP_BT 0x0600 /* mark for "(?>...)" */
#define STK_REPEAT 0x0700
#define STK_CALL_FRAME 0x0800
#define STK_RETURN 0x0900
#define STK_MEM_END_MARK 0x0a00
-#define STK_VOID 0x0b00 /* for fill a blank */
+#define STK_VOID 0x0b00 /* for fill a blank */
+#define STK_NULL_CHECK_END 0x0c00 /* for recursive call */
/* stack type check mask */
#define STK_MASK_POP_USED 0x00ff
typedef struct {
void* stack_p;
int stack_n;
- RegOptionType options;
- RegRegion* region;
+ OnigOptionType options;
+ OnigRegion* region;
UChar* start; /* search start position (for \G: BEGIN_POSITION) */
} MatchArg;
x = (StackType* )xmalloc(sizeof(StackType) * n * 2);
if (IS_NULL(x)) {
STACK_SAVE;
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
}
xmemcpy(x, stk_base, n * sizeof(StackType));
n *= 2;
}
else {
n *= 2;
- if (n > MATCH_STACK_LIMIT_SIZE) return REGERR_MATCH_STACK_LIMIT_OVER;
+ if (n > MATCH_STACK_LIMIT_SIZE) return ONIGERR_MATCH_STACK_LIMIT_OVER;
x = (StackType* )xrealloc(stk_base, sizeof(StackType) * n);
if (IS_NULL(x)) {
STACK_SAVE;
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
}
}
*arg_stk = x + (stk - stk_base);
}\
} while (0)
+#define STACK_GET_MEM_RANGE(k, mnum, start, end) do {\
+ int level = 0;\
+ while (k < stk) {\
+ if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\
+ if (level == 0) (start) = k->u.mem.pstr;\
+ level++;\
+ }\
+ else if (k->type == STK_MEM_END && k->u.mem.num == (mnum)) {\
+ level--;\
+ if (level == 0) {\
+ (end) = k->u.mem.pstr;\
+ break;\
+ }\
+ }\
+ k++;\
+ }\
+} while (0)
+
#define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\
STACK_ENSURE(1);\
stk->type = STK_NULL_CHECK_START;\
STACK_INC;\
} while(0)
+#define STACK_PUSH_NULL_CHECK_END(cnum) do {\
+ STACK_ENSURE(1);\
+ stk->type = STK_NULL_CHECK_END;\
+ stk->u.null_check.num = (cnum);\
+ STACK_INC;\
+} while(0)
+
#define STACK_PUSH_CALL_FRAME(pat) do {\
STACK_ENSURE(1);\
stk->type = STK_CALL_FRAME;\
} while(0)
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
#define STACK_BASE_CHECK(p) \
if ((p) < stk_base) goto stack_error;
#else
}\
} while(0)
+#define STACK_NULL_CHECK_REC(isnull,id,s) do {\
+ int level = 0;\
+ StackType* k = stk;\
+ while (1) {\
+ k--;\
+ STACK_BASE_CHECK(k); \
+ if (k->type == STK_NULL_CHECK_START) {\
+ if (k->u.null_check.num == (id)) {\
+ if (level == 0) {\
+ (isnull) = (k->u.null_check.pstr == (s));\
+ break;\
+ }\
+ else level--;\
+ }\
+ }\
+ else if (k->type == STK_NULL_CHECK_END) {\
+ level++;\
+ }\
+ }\
+} while(0)
+
+#define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\
+ StackType* k = stk;\
+ while (1) {\
+ k--;\
+ STACK_BASE_CHECK(k); \
+ if (k->type == STK_NULL_CHECK_START) {\
+ if (k->u.null_check.num == (id)) {\
+ if (k->u.null_check.pstr != (s)) {\
+ (isnull) = 0;\
+ break;\
+ }\
+ else {\
+ UChar* endp;\
+ (isnull) = 1;\
+ while (k < stk) {\
+ if (k->type == STK_MEM_START) {\
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\
+ (isnull) = 0; break;\
+ }\
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
+ else\
+ endp = (UChar* )k->u.mem.end;\
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
+ (isnull) = 0; break;\
+ }\
+ else if (endp != s) {\
+ (isnull) = -1; /* empty, but position changed */ \
+ }\
+ }\
+ k++;\
+ }\
+ break;\
+ }\
+ }\
+ }\
+ }\
+} while(0)
+
+#define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\
+ int level = 0;\
+ StackType* k = stk;\
+ while (1) {\
+ k--;\
+ STACK_BASE_CHECK(k); \
+ if (k->type == STK_NULL_CHECK_START) {\
+ if (k->u.null_check.num == (id)) {\
+ if (level == 0) {\
+ if (k->u.null_check.pstr != (s)) {\
+ (isnull) = 0;\
+ break;\
+ }\
+ else {\
+ UChar* endp;\
+ (isnull) = 1;\
+ while (k < stk) {\
+ if (k->type == STK_MEM_START) {\
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\
+ (isnull) = 0; break;\
+ }\
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
+ else\
+ endp = (UChar* )k->u.mem.end;\
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
+ (isnull) = 0; break;\
+ }\
+ else if (endp != s) {\
+ (isnull) = -1; /* empty, but position changed */ \
+ }\
+ }\
+ k++;\
+ }\
+ break;\
+ }\
+ }\
+ else {\
+ level--;\
+ }\
+ }\
+ }\
+ else if (k->type == STK_NULL_CHECK_END) {\
+ if (k->u.null_check.num == (id)) level++;\
+ }\
+ }\
+} while(0)
+
#define STACK_GET_REPEAT(id, k) do {\
int level = 0;\
k = stk;\
} while(0)
-#define CASETABLE_TOLOWER(c) (casetable[c])
-
-/* byte_code is already converted to lower-case at string compile time */
-#define SBTRANSCMP(byte_code,c) (byte_code == CASETABLE_TOLOWER(c))
-
#define STRING_CMP(s1,s2,len) do {\
- if (ignore_case) {\
- int slen; \
- while (len > 0) {\
- slen = mblen(encode, *s1); \
- if (slen == 1) {\
- if (CASETABLE_TOLOWER(*s1) != CASETABLE_TOLOWER(*s2)) \
- goto fail;\
- s1++; s2++; len--; \
- } \
- else {\
- len -= slen; \
- while (slen-- > 0) { \
- if (*s1++ != *s2++) goto fail;\
- } \
- }\
- }\
- }\
- else {\
- while (len-- > 0) {\
- if (*s1++ != *s2++) goto fail;\
- }\
+ while (len-- > 0) {\
+ if (*s1++ != *s2++) goto fail;\
}\
} while(0)
+#define STRING_CMP_IC(s1,ps2,len) do {\
+ if (string_cmp_ic(encode, s1, ps2, len) == 0) \
+ goto fail; \
+} while(0)
+
+static int string_cmp_ic(OnigEncoding enc,
+ UChar* s1, UChar** ps2, int mblen)
+{
+ UChar buf1[ONIGENC_MBC_TO_LOWER_MAXLEN];
+ UChar buf2[ONIGENC_MBC_TO_LOWER_MAXLEN];
+ UChar *p1, *p2, *end, *s2;
+ int len1, len2;
+
+ s2 = *ps2;
+ end = s1 + mblen;
+ while (s1 < end) {
+ len1 = ONIGENC_MBC_TO_LOWER(enc, s1, buf1);
+ len2 = ONIGENC_MBC_TO_LOWER(enc, s2, buf2);
+ if (len1 != len2) return 0;
+ p1 = buf1;
+ p2 = buf2;
+ while (len1-- > 0) {
+ if (*p1 != *p2) return 0;
+ p1++;
+ p2++;
+ }
+
+ s1 += enc_len(enc, *s1);
+ s2 += enc_len(enc, *s2);
+ }
+
+ *ps2 = s2;
+ return 1;
+}
+
#define STRING_CMP_VALUE(s1,s2,len,is_fail) do {\
is_fail = 0;\
- if (ignore_case) {\
- int slen; \
- while (len > 0) {\
- slen = mblen(encode, *s1); \
- if (slen == 1) {\
- if (CASETABLE_TOLOWER(*s1) != CASETABLE_TOLOWER(*s2)) {\
- is_fail = 1; break;\
- }\
- s1++; s2++; len--; \
- } \
- else {\
- len -= slen; \
- while (slen-- > 0) { \
- if (*s1++ != *s2++) {\
- is_fail = 1; break;\
- }\
- } \
- if (is_fail != 0) break;\
- }\
- }\
- }\
- else {\
- while (len-- > 0) {\
- if (*s1++ != *s2++) {\
- is_fail = 1; break;\
- }\
+ while (len-- > 0) {\
+ if (*s1++ != *s2++) {\
+ is_fail = 1; break;\
}\
}\
} while(0)
+#define STRING_CMP_VALUE_IC(s1,ps2,len,is_fail) do {\
+ if (string_cmp_ic(encode, s1, ps2, len) == 0) \
+ is_fail = 1; \
+ else \
+ is_fail = 0; \
+} while(0)
+
#define ON_STR_BEGIN(s) ((s) == str)
#define ON_STR_END(s) ((s) == end)
#define IS_EMPTY_STR (str == end)
#define DATA_ENSURE_CHECK(n) (s + (n) <= end)
-#ifdef REG_DEBUG_STATISTICS
+#ifdef ONIG_DEBUG_STATISTICS
#define USE_TIMEOFDAY
OpTime[OpCurr] += TIMEDIFF(te, ts);\
} while (0)
-extern void regex_statistics_init()
+#ifdef RUBY_PLATFORM
+static VALUE onig_stat_print()
+{
+ onig_print_statistics(stderr);
+ return Qnil;
+}
+#endif
+
+extern void onig_statistics_init()
{
int i;
for (i = 0; i < 256; i++) {
MaxStackDepth = 0;
#ifdef RUBY_PLATFORM
- rb_define_global_function("regex_stat_print", regex_stat_print, 0);
+ ONIG_RUBY_DEFINE_GLOBAL_FUNCTION("onig_stat_print", onig_stat_print, 0);
#endif
}
-#ifdef RUBY_PLATFORM
-static VALUE regex_stat_print()
-{
- regex_print_statistics(stderr);
- return Qnil;
-}
-#endif
-
extern void
-regex_print_statistics(FILE* f)
+onig_print_statistics(FILE* f)
{
int i;
fprintf(f, " count prev time\n");
- for (i = 0; RegOpInfo[i].opcode >= 0; i++) {
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {
fprintf(f, "%8d: %8d: %10ld: %s\n",
- OpCounter[i], OpPrevCounter[i], OpTime[i], RegOpInfo[i].name);
+ OpCounter[i], OpPrevCounter[i], OpTime[i], OnigOpInfo[i].name);
}
fprintf(f, "\nmax stack depth: %d\n", MaxStackDepth);
}
#endif
extern int
-regex_is_in_wc_range(UChar* p, WCINT wc)
+onig_is_in_code_range(UChar* p, OnigCodePoint code)
{
- WCINT n, *data;
+ OnigCodePoint n, *data;
int low, high, x;
- GET_WCINT(n, p);
- data = (WCINT* )p;
+ GET_CODE_POINT(n, p);
+ data = (OnigCodePoint* )p;
data++;
for (low = 0, high = n; low < high; ) {
x = (low + high) >> 1;
- if (wc > data[x * 2 + 1])
+ if (code > data[x * 2 + 1])
low = x + 1;
else
high = x;
}
- return ((low < n && wc >= data[low * 2]) ? 1 : 0);
+ return ((low < n && code >= data[low * 2]) ? 1 : 0);
}
{
static UChar FinishCode[] = { OP_FINISH };
- int i, n, num_mem, best_len, pop_level, find_cond;
+ int i, n, num_mem, best_len, pop_level;
LengthType tlen, tlen2;
MemNumType mem;
RelAddrType addr;
- RegOptionType option = reg->options;
- RegCharEncoding encode = reg->enc;
- unsigned char* casetable = DefaultTransTable;
+ OnigOptionType option = reg->options;
+ OnigEncoding encode = reg->enc;
int ignore_case;
UChar *s, *q, *sbegin;
UChar *p = reg->p;
STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);
ignore_case = IS_IGNORECASE(option);
- find_cond = IS_FIND_CONDITION(option);
pop_level = reg->stack_pop_level;
num_mem = reg->num_mem;
repeat_stk = (StackIndex* )alloca_base;
mem_start_stk[i] = mem_end_stk[i] = INVALID_STACK_INDEX;
}
-#ifdef REG_DEBUG_MATCH
+#ifdef ONIG_DEBUG_MATCH
fprintf(stderr, "match_at: str: %d, end: %d, start: %d, sprev: %d\n",
(int )str, (int )end, (int )sstart, (int )sprev);
fprintf(stderr, "size: %d, start offset: %d\n",
#endif
STACK_PUSH_ENSURED(STK_ALT, FinishCode); /* bottom stack */
- best_len = REG_MISMATCH;
+ best_len = ONIG_MISMATCH;
s = sstart;
while (1) {
-#ifdef REG_DEBUG_MATCH
+#ifdef ONIG_DEBUG_MATCH
{
UChar *q, *bp, buf[50];
int len;
fprintf(stderr, "%4d> \"", (int )(s - str));
bp = buf;
for (i = 0, q = s; i < 7 && q < end; i++) {
- len = mblen(encode, *q);
+ len = enc_len(encode, *q);
while (len-- > 0) *bp++ = *q++;
}
if (q < end) { xmemcpy(bp, "...\"", 4); bp += 4; }
*bp = 0;
fputs(buf, stderr);
for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr);
- regex_print_compiled_byte_code(stderr, p, NULL);
+ onig_print_compiled_byte_code(stderr, p, NULL);
fprintf(stderr, "\n");
}
#endif
case OP_END: STAT_OP_IN(OP_END);
n = s - sstart;
if (n > best_len) {
- RegRegion* region = msa->region;
+ OnigRegion* region = msa->region;
best_len = n;
if (region) {
+#ifdef USE_POSIX_REGION_OPTION
if (IS_POSIX_REGION(msa->options)) {
posix_regmatch_t* rmt = (posix_regmatch_t* )region;
rmt[0].rm_eo = s - str;
for (i = 1; i <= num_mem; i++) {
if (mem_end_stk[i] != INVALID_STACK_INDEX) {
- if (BIT_STATUS_AT(reg->backtrack_mem, i))
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))
rmt[i].rm_so = STACK_AT(mem_start_stk[i])->u.mem.pstr - str;
else
rmt[i].rm_so = (UChar* )((void* )(mem_start_stk[i])) - str;
- rmt[i].rm_eo = (find_cond != 0
+ rmt[i].rm_eo = (BIT_STATUS_AT(reg->bt_mem_end, i)
? STACK_AT(mem_end_stk[i])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[i])) - str;
}
else {
- rmt[i].rm_so = rmt[i].rm_eo = REG_REGION_NOTPOS;
+ rmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS;
}
}
}
else {
+#endif /* USE_POSIX_REGION_OPTION */
region->beg[0] = sstart - str;
region->end[0] = s - str;
for (i = 1; i <= num_mem; i++) {
if (mem_end_stk[i] != INVALID_STACK_INDEX) {
- if (BIT_STATUS_AT(reg->backtrack_mem, i))
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))
region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str;
else
region->beg[i] = (UChar* )((void* )mem_start_stk[i]) - str;
- region->end[i] = (find_cond != 0
+ region->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i)
? STACK_AT(mem_end_stk[i])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[i])) - str;
}
else {
- region->beg[i] = region->end[i] = REG_REGION_NOTPOS;
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
}
}
- }
- }
- }
+
+ if (reg->capture_history != 0) {
+ UChar *pstart, *pend;
+ for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
+ if (BIT_STATUS_AT(reg->capture_history, i) != 0) {
+ stkp = stk_base;
+ do {
+ STACK_GET_MEM_RANGE(stkp, i, pstart, pend);
+ if (stkp < stk) {
+ int r;
+ r = region_list_add_entry(region, i,
+ pstart - str, pend - str);
+ if (r) {
+ STACK_SAVE;
+ return r;
+ }
+ }
+ stkp++;
+ } while (stkp < stk);
+ }
+ }
+ } /* list of captures */
+#ifdef USE_POSIX_REGION_OPTION
+ } /* else IS_POSIX_REGION() */
+#endif
+ } /* if (region) */
+ } /* n > best_len */
STAT_OP_OUT;
- if (find_cond) {
+ if (IS_FIND_CONDITION(option)) {
if (IS_FIND_NOT_EMPTY(option) && s == sstart) {
- best_len = REG_MISMATCH;
+ best_len = ONIG_MISMATCH;
goto fail; /* for retry */
}
if (IS_FIND_LONGEST(option) && s < end) {
break;
case OP_EXACT1_IC: STAT_OP_IN(OP_EXACT1_IC);
- if (! SBTRANSCMP(*p, *s)) goto fail;
- DATA_ENSURE(1);
- p++; s++;
+ {
+ int len;
+ UChar *q, lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
+
+ len = ONIGENC_MBC_TO_LOWER(encode, s, lowbuf);
+ DATA_ENSURE(len);
+ q = lowbuf;
+ s += enc_len(encode, *s);
+ while (len-- > 0) {
+ if (*p != *q) goto fail;
+ p++; q++;
+ }
+ }
STAT_OP_OUT;
break;
break;
case OP_EXACTN_IC: STAT_OP_IN(OP_EXACTN_IC);
- GET_LENGTH_INC(tlen, p);
- DATA_ENSURE(tlen);
- while (tlen-- > 0) {
- if (! SBTRANSCMP(*p, *s)) goto fail;
- p++; s++;
+ {
+ int len;
+ UChar *q, *endp, lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
+
+ GET_LENGTH_INC(tlen, p);
+ endp = p + tlen;
+
+ while (p < endp) {
+ len = ONIGENC_MBC_TO_LOWER(encode, s, lowbuf);
+ DATA_ENSURE(len);
+ sprev = s;
+ s += enc_len(encode, *s);
+ q = lowbuf;
+ while (len-- > 0) {
+ if (*p != *q) goto fail;
+ p++; q++;
+ }
+ }
}
- sprev = s - 1;
+
STAT_OP_OUT;
continue;
break;
DATA_ENSURE(1);
if (BITSET_AT(((BitSetRef )p), *s) == 0) goto fail;
p += SIZE_BITSET;
- s += mblen(encode, *s); /* OP_CCLASS can match mb-code. \D, \S */
+ s += enc_len(encode, *s); /* OP_CCLASS can match mb-code. \D, \S */
STAT_OP_OUT;
break;
case OP_CCLASS_MB: STAT_OP_IN(OP_CCLASS_MB);
- if (! ismb(encode, *s)) goto fail;
+ if (! ONIGENC_IS_MBC_HEAD(encode, *s)) goto fail;
cclass_mb:
GET_LENGTH_INC(tlen, p);
{
- WCINT wc;
+ OnigCodePoint code;
UChar *ss;
- int mb_len = mblen(encode, *s);
+ int mb_len = enc_len(encode, *s);
DATA_ENSURE(mb_len);
ss = s;
s += mb_len;
- wc = MB2WC(ss, s, encode);
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);
-#ifdef UNALIGNED_WORD_ACCESS
- if (! regex_is_in_wc_range(p, wc)) goto fail;
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
+ if (! onig_is_in_code_range(p, code)) goto fail;
#else
q = p;
ALIGNMENT_RIGHT(q);
- if (! regex_is_in_wc_range(q, wc)) goto fail;
+ if (! onig_is_in_code_range(q, code)) goto fail;
#endif
}
p += tlen;
case OP_CCLASS_MIX: STAT_OP_IN(OP_CCLASS_MIX);
DATA_ENSURE(1);
- if (ismb(encode, *s)) {
+ if (ONIGENC_IS_MBC_HEAD(encode, *s)) {
p += SIZE_BITSET;
goto cclass_mb;
}
DATA_ENSURE(1);
if (BITSET_AT(((BitSetRef )p), *s) != 0) goto fail;
p += SIZE_BITSET;
- s += mblen(encode, *s);
+ s += enc_len(encode, *s);
STAT_OP_OUT;
break;
case OP_CCLASS_MB_NOT: STAT_OP_IN(OP_CCLASS_MB_NOT);
- if (! ismb(encode, *s)) {
+ if (! ONIGENC_IS_MBC_HEAD(encode, *s)) {
DATA_ENSURE(1);
s++;
GET_LENGTH_INC(tlen, p);
cclass_mb_not:
GET_LENGTH_INC(tlen, p);
{
- WCINT wc;
+ OnigCodePoint code;
UChar *ss;
- int mb_len = mblen(encode, *s);
+ int mb_len = enc_len(encode, *s);
if (s + mb_len > end) {
s = end;
ss = s;
s += mb_len;
- wc = MB2WC(ss, s, encode);
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);
-#ifdef UNALIGNED_WORD_ACCESS
- if (regex_is_in_wc_range(p, wc)) goto fail;
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
+ if (onig_is_in_code_range(p, code)) goto fail;
#else
q = p;
ALIGNMENT_RIGHT(q);
- if (regex_is_in_wc_range(q, wc)) goto fail;
+ if (onig_is_in_code_range(q, code)) goto fail;
#endif
}
p += tlen;
case OP_CCLASS_MIX_NOT: STAT_OP_IN(OP_CCLASS_MIX_NOT);
DATA_ENSURE(1);
- if (ismb(encode, *s)) {
+ if (ONIGENC_IS_MBC_HEAD(encode, *s)) {
p += SIZE_BITSET;
goto cclass_mb_not;
}
break;
case OP_ANYCHAR: STAT_OP_IN(OP_ANYCHAR);
- DATA_ENSURE(1);
- if (ismb(encode, *s)) {
- n = mblen(encode, *s);
+ n = enc_len(encode, *s);
+ if (n > 1) {
DATA_ENSURE(n);
s += n;
}
else {
- if (! IS_MULTILINE(option)) {
- if (IS_NEWLINE(*s)) goto fail;
- }
+ DATA_ENSURE(1);
+ if (ONIG_IS_NEWLINE(*s)) goto fail;
s++;
}
STAT_OP_OUT;
break;
+ case OP_ANYCHAR_ML: STAT_OP_IN(OP_ANYCHAR_ML);
+ n = enc_len(encode, *s);
+ DATA_ENSURE(n);
+ s += n;
+ STAT_OP_OUT;
+ break;
+
case OP_ANYCHAR_STAR: STAT_OP_IN(OP_ANYCHAR_STAR);
- if (! IS_MULTILINE(option)) {
- while (s < end) {
- STACK_PUSH_ALT(p, s, sprev);
- if (ismb(encode, *s)) {
- n = mblen(encode, *s);
- DATA_ENSURE(n);
- sprev = s;
- s += n;
- }
- else {
- if (IS_NEWLINE(*s)) goto fail;
- sprev = s;
- s++;
- }
+ while (s < end) {
+ STACK_PUSH_ALT(p, s, sprev);
+ n = enc_len(encode, *s);
+ if (n > 1) {
+ DATA_ENSURE(n);
+ sprev = s;
+ s += n;
+ }
+ else {
+ if (ONIG_IS_NEWLINE(*s)) goto fail;
+ sprev = s;
+ s++;
}
}
- else {
- while (s < end) {
- STACK_PUSH_ALT(p, s, sprev);
- if (ismb(encode, *s)) {
- n = mblen(encode, *s);
- DATA_ENSURE(n);
- sprev = s;
- s += n;
- }
- else {
- sprev = s;
- s++;
- }
+ STAT_OP_OUT;
+ break;
+
+ case OP_ANYCHAR_ML_STAR: STAT_OP_IN(OP_ANYCHAR_ML_STAR);
+ while (s < end) {
+ STACK_PUSH_ALT(p, s, sprev);
+ n = enc_len(encode, *s);
+ if (n > 1) {
+ DATA_ENSURE(n);
+ sprev = s;
+ s += n;
+ }
+ else {
+ sprev = s;
+ s++;
}
}
STAT_OP_OUT;
if (*p == *s) {
STACK_PUSH_ALT(p + 1, s, sprev);
}
- if (ismb(encode, *s)) {
- n = mblen(encode, *s);
+ n = enc_len(encode, *s);
+ if (n > 1) {
DATA_ENSURE(n);
sprev = s;
s += n;
}
else {
- if (! IS_MULTILINE(option)) {
- if (IS_NEWLINE(*s)) goto fail;
- }
+ if (ONIG_IS_NEWLINE(*s)) goto fail;
sprev = s;
s++;
}
STAT_OP_OUT;
break;
- case OP_WORD: STAT_OP_IN(OP_WORD);
- DATA_ENSURE(1);
- if (! IS_WORD_STR_INC(encode, s, end))
- goto fail;
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:STAT_OP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);
+ while (s < end) {
+ if (*p == *s) {
+ STACK_PUSH_ALT(p + 1, s, sprev);
+ }
+ n = enc_len(encode, *s);
+ if (n >1) {
+ DATA_ENSURE(n);
+ sprev = s;
+ s += n;
+ }
+ else {
+ sprev = s;
+ s++;
+ }
+ }
+ p++;
STAT_OP_OUT;
break;
- case OP_NOT_WORD: STAT_OP_IN(OP_NOT_WORD);
+ case OP_WORD: STAT_OP_IN(OP_WORD);
DATA_ENSURE(1);
- if (IS_WORD_STR_INC(encode, s, end))
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))
goto fail;
- STAT_OP_OUT;
- break;
-#ifdef USE_SBMB_CLASS
- case OP_WORD_SB: STAT_OP_IN(OP_WORD_SB);
- DATA_ENSURE(1);
- if (! IS_SB_WORD(encode, *s))
- goto fail;
- s++;
+ s += enc_len(encode, *s);
STAT_OP_OUT;
break;
- case OP_WORD_MB: STAT_OP_IN(OP_WORD_MB);
+ case OP_NOT_WORD: STAT_OP_IN(OP_NOT_WORD);
DATA_ENSURE(1);
- if (! IS_MB_WORD(encode, *s))
+ if (ONIGENC_IS_MBC_WORD(encode, s, end))
goto fail;
- n = mblen(encode, *s);
- DATA_ENSURE(n);
- s += n;
+ s += enc_len(encode, *s);
STAT_OP_OUT;
break;
-#endif
case OP_WORD_BOUND: STAT_OP_IN(OP_WORD_BOUND);
if (ON_STR_BEGIN(s)) {
DATA_ENSURE(1);
- if (! IS_WORD_STR(encode, s, end))
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))
goto fail;
}
else if (ON_STR_END(s)) {
- if (! IS_WORD_STR(encode, sprev, end))
+ if (! ONIGENC_IS_MBC_WORD(encode, sprev, end))
goto fail;
}
else {
- if (IS_WORD_STR(encode, s, end) == IS_WORD_STR(encode, sprev, end))
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)
+ == ONIGENC_IS_MBC_WORD(encode, sprev, end))
goto fail;
}
STAT_OP_OUT;
case OP_NOT_WORD_BOUND: STAT_OP_IN(OP_NOT_WORD_BOUND);
if (ON_STR_BEGIN(s)) {
- if (DATA_ENSURE_CHECK(1) && IS_WORD_STR(encode, s, end))
+ if (DATA_ENSURE_CHECK(1) && ONIGENC_IS_MBC_WORD(encode, s, end))
goto fail;
}
else if (ON_STR_END(s)) {
- if (IS_WORD_STR(encode, sprev, end))
+ if (ONIGENC_IS_MBC_WORD(encode, sprev, end))
goto fail;
}
else {
- if (IS_WORD_STR(encode, s, end) != IS_WORD_STR(encode, sprev, end))
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)
+ != ONIGENC_IS_MBC_WORD(encode, sprev, end))
goto fail;
}
STAT_OP_OUT;
#ifdef USE_WORD_BEGIN_END
case OP_WORD_BEGIN: STAT_OP_IN(OP_WORD_BEGIN);
- if (DATA_ENSURE_CHECK(1) && IS_WORD_STR(encode, s, end)) {
- if (ON_STR_BEGIN(s) || !IS_WORD_STR(encode, sprev, end)) {
+ if (DATA_ENSURE_CHECK(1) && ONIGENC_IS_MBC_WORD(encode, s, end)) {
+ if (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
STAT_OP_OUT;
continue;
}
break;
case OP_WORD_END: STAT_OP_IN(OP_WORD_END);
- if (!ON_STR_BEGIN(s) && IS_WORD_STR(encode, sprev, end)) {
- if (ON_STR_END(s) || !IS_WORD_STR(encode, s, end)) {
+ if (!ON_STR_BEGIN(s) && ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
+ if (ON_STR_END(s) || !ONIGENC_IS_MBC_WORD(encode, s, end)) {
STAT_OP_OUT;
continue;
}
STAT_OP_OUT;
continue;
}
- else if (IS_NEWLINE(*sprev) && !ON_STR_END(s)) {
+ else if (ONIG_IS_NEWLINE(*sprev) && !ON_STR_END(s)) {
STAT_OP_OUT;
continue;
}
case OP_END_LINE: STAT_OP_IN(OP_END_LINE);
if (ON_STR_END(s)) {
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
- if (IS_EMPTY_STR || !IS_NEWLINE(*sprev)) {
+ if (IS_EMPTY_STR || !ONIG_IS_NEWLINE(*sprev)) {
#endif
if (IS_NOTEOL(msa->options)) goto fail;
STAT_OP_OUT;
}
#endif
}
- else if (IS_NEWLINE(*s)) {
+ else if (ONIG_IS_NEWLINE(*s)) {
STAT_OP_OUT;
continue;
}
case OP_SEMI_END_BUF: STAT_OP_IN(OP_SEMI_END_BUF);
if (ON_STR_END(s)) {
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
- if (IS_EMPTY_STR || !IS_NEWLINE(*sprev)) {
+ if (IS_EMPTY_STR || !ONIG_IS_NEWLINE(*sprev)) {
#endif
if (IS_NOTEOL(msa->options)) goto fail; /* Is it needed? */
STAT_OP_OUT;
}
#endif
}
- if (IS_NEWLINE(*s) && ON_STR_END(s+1)) {
+ if (ONIG_IS_NEWLINE(*s) && ON_STR_END(s+1)) {
STAT_OP_OUT;
continue;
}
#ifdef USE_SUBEXP_CALL
case OP_MEMORY_END_PUSH_REC: STAT_OP_IN(OP_MEMORY_END_PUSH_REC);
GET_MEMNUM_INC(mem, p);
+ STACK_PUSH_MEM_END(mem, s);
STACK_GET_MEM_START(mem, stkp);
mem_start_stk[mem] = GET_STACK_INDEX(stkp);
- STACK_PUSH_MEM_END(mem, s);
STAT_OP_OUT;
continue;
break;
if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
- if (BIT_STATUS_AT(reg->backtrack_mem, mem))
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
- pend = (find_cond != 0
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
n = pend - pstart;
DATA_ENSURE(n);
sprev = s;
STRING_CMP(pstart, s, n);
- while (sprev + (len = mblen(encode, *sprev)) < s)
+ while (sprev + (len = enc_len(encode, *sprev)) < s)
+ sprev += len;
+
+ STAT_OP_OUT;
+ continue;
+ }
+ break;
+
+ case OP_BACKREFN_IC: STAT_OP_IN(OP_BACKREFN_IC);
+ GET_MEMNUM_INC(mem, p);
+ {
+ int len;
+ UChar *pstart, *pend;
+
+ /* if you want to remove following line,
+ you should check in parse and compile time. */
+ if (mem > num_mem) goto fail;
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
+
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
+ else
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
+
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
+ : (UChar* )((void* )mem_end_stk[mem]));
+ n = pend - pstart;
+ DATA_ENSURE(n);
+ sprev = s;
+ STRING_CMP_IC(pstart, &s, n);
+ while (sprev + (len = enc_len(encode, *sprev)) < s)
sprev += len;
STAT_OP_OUT;
if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
- if (BIT_STATUS_AT(reg->backtrack_mem, mem))
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
else
pstart = (UChar* )((void* )mem_start_stk[mem]);
- pend = (find_cond != 0
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
? STACK_AT(mem_end_stk[mem])->u.mem.pstr
: (UChar* )((void* )mem_end_stk[mem]));
n = pend - pstart;
STRING_CMP_VALUE(pstart, swork, n, is_fail);
if (is_fail) continue;
s = swork;
- while (sprev + (len = mblen(encode, *sprev)) < s)
+ while (sprev + (len = enc_len(encode, *sprev)) < s)
+ sprev += len;
+
+ p += (SIZE_MEMNUM * (tlen - i - 1));
+ break; /* success */
+ }
+ if (i == tlen) goto fail;
+ STAT_OP_OUT;
+ continue;
+ }
+ break;
+
+ case OP_BACKREF_MULTI_IC: STAT_OP_IN(OP_BACKREF_MULTI_IC);
+ {
+ int len, is_fail;
+ UChar *pstart, *pend, *swork;
+
+ GET_LENGTH_INC(tlen, p);
+ for (i = 0; i < tlen; i++) {
+ GET_MEMNUM_INC(mem, p);
+
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
+
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
+ else
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
+
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
+ : (UChar* )((void* )mem_end_stk[mem]));
+ n = pend - pstart;
+ DATA_ENSURE(n);
+ sprev = s;
+ swork = s;
+ STRING_CMP_VALUE_IC(pstart, &swork, n, is_fail);
+ if (is_fail) continue;
+ s = swork;
+ while (sprev + (len = enc_len(encode, *sprev)) < s)
sprev += len;
p += (SIZE_MEMNUM * (tlen - i - 1));
GET_MEMNUM_INC(mem, p); /* mem: null check id */
STACK_NULL_CHECK(isnull, mem, s);
if (isnull) {
-#ifdef REG_DEBUG_MATCH
+#ifdef ONIG_DEBUG_MATCH
fprintf(stderr, "NULL_CHECK_END: skip id:%d, s:%d\n",
(int )mem, (int )s);
#endif
+ null_check_found:
/* empty loop founded, skip next instruction */
switch (*p++) {
case OP_JUMP:
continue;
break;
+#ifdef USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK
+ case OP_NULL_CHECK_END_MEMST: STAT_OP_IN(OP_NULL_CHECK_END_MEMST);
+ {
+ int isnull;
+
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
+ STACK_NULL_CHECK_MEMST(isnull, mem, s, reg);
+ if (isnull) {
+#ifdef ONIG_DEBUG_MATCH
+ fprintf(stderr, "NULL_CHECK_END_MEMST: skip id:%d, s:%d\n",
+ (int )mem, (int )s);
+#endif
+ if (isnull == -1) goto fail;
+ goto null_check_found;
+ }
+ }
+ STAT_OP_OUT;
+ continue;
+ break;
+#endif
+
+#ifdef USE_SUBEXP_CALL
+ case OP_NULL_CHECK_END_MEMST_PUSH:
+ STAT_OP_IN(OP_NULL_CHECK_END_MEMST_PUSH);
+ {
+ int isnull;
+
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
+#ifdef USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK
+ STACK_NULL_CHECK_MEMST_REC(isnull, mem, s, reg);
+#else
+ STACK_NULL_CHECK_REC(isnull, mem, s);
+#endif
+ if (isnull) {
+#ifdef ONIG_DEBUG_MATCH
+ fprintf(stderr, "NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%d\n",
+ (int )mem, (int )s);
+#endif
+ if (isnull == -1) goto fail;
+ goto null_check_found;
+ }
+ else {
+ STACK_PUSH_NULL_CHECK_END(mem);
+ }
+ }
+ STAT_OP_OUT;
+ continue;
+ break;
+#endif
+
case OP_JUMP: STAT_OP_IN(OP_JUMP);
GET_RELADDR_INC(addr, p);
p += addr;
stkp = STACK_AT(si);
#endif
stkp->u.repeat.count++;
- if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {
- /* end of repeat. Nothing to do. */
+ if (stkp->u.repeat.count < reg->repeat_range[mem].upper) {
+ if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {
+ UChar* pcode = stkp->u.repeat.pcode;
+
+ STACK_PUSH_REPEAT_INC(si);
+ STACK_PUSH_ALT(pcode, s, sprev);
+ }
+ else {
+ p = stkp->u.repeat.pcode;
+ STACK_PUSH_REPEAT_INC(si);
+ }
}
- else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {
- STACK_PUSH_ALT(stkp->u.repeat.pcode, s, sprev);
+ else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {
+ STACK_PUSH_REPEAT_INC(si);
}
- else {
- p = stkp->u.repeat.pcode;
- }
- STACK_PUSH_REPEAT_INC(si);
}
STAT_OP_OUT;
continue;
case OP_LOOK_BEHIND: STAT_OP_IN(OP_LOOK_BEHIND);
GET_LENGTH_INC(tlen, p);
- s = MBBACK(encode, str, s, (int )tlen);
+ s = ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
if (IS_NULL(s)) goto fail;
- sprev = regex_get_prev_char_head(encode, str, s);
+ sprev = onigenc_get_prev_char_head(encode, str, s);
STAT_OP_OUT;
continue;
break;
case OP_PUSH_LOOK_BEHIND_NOT: STAT_OP_IN(OP_PUSH_LOOK_BEHIND_NOT);
GET_RELADDR_INC(addr, p);
GET_LENGTH_INC(tlen, p);
- q = MBBACK(encode, str, s, (int )tlen);
+ q = ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
if (IS_NULL(q)) {
/* too short case -> success. ex. /(?<!XXX)a/.match("a")
If you want to change to fail, replace following line. */
else {
STACK_PUSH_LOOK_BEHIND_NOT(p + addr, s, sprev);
s = q;
- sprev = regex_get_prev_char_head(encode, str, s);
+ sprev = onigenc_get_prev_char_head(encode, str, s);
}
STAT_OP_OUT;
continue;
STACK_SAVE;
return best_len;
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
stack_error:
STACK_SAVE;
- return REGERR_STACK_BUG;
+ return ONIGERR_STACK_BUG;
#endif
bytecode_error:
STACK_SAVE;
- return REGERR_UNDEFINED_BYTECODE;
+ return ONIGERR_UNDEFINED_BYTECODE;
unexpected_bytecode_error:
STACK_SAVE;
- return REGERR_UNEXPECTED_BYTECODE;
-}
-
-
-UChar* DefaultTransTable = (UChar* )0;
-
-#ifndef REG_RUBY_M17N
-static const char SJIS_FOLLOW_TABLE[SINGLE_BYTE_SIZE] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
-};
-
-#define eucjp_islead(c) ((UChar )((c) - 0xa1) > 0xfe - 0xa1)
-#define utf8_islead(c) ((UChar )((c) & 0xc0) != 0x80)
-#define sjis_ismbfirst(c) ismb(REGCODE_SJIS, (c))
-#define sjis_ismbtrail(c) SJIS_FOLLOW_TABLE[(c)]
-
-extern WCINT
-regex_mb2wc(UChar* p, UChar* end, RegCharEncoding code)
-{
- int c, i, len;
- WCINT n;
-
- if (code == REGCODE_UTF8) {
- c = *p++;
- len = mblen(code,c);
- if (len > 1) {
- len--;
- n = c & ((1 << (6 - len)) - 1);
- while (len--) {
- c = *p++;
- n = (n << 6) | (c & ((1 << 6) - 1));
- }
- }
- else
- n = c;
- }
- else {
- c = *p++;
- len = mblen(code,c);
- n = c;
- if (len == 1) return n;
-
- for (i = 1; i < len; i++) {
- if (p >= end) break;
- c = *p++;
- n <<= 8; n += c;
- }
- }
- return n;
-}
-#endif /* REG_RUBY_M17N */
-
-extern UChar*
-regex_get_left_adjust_char_head(RegCharEncoding code, UChar* start, UChar* s)
-{
- UChar *p;
- int len;
-
- if (s <= start) return s;
- p = s;
-
-#ifdef REG_RUBY_M17N
- while (!m17n_islead(code, *p) && p > start) p--;
- while (p + (len = mblen(code, *p)) < s) {
- p += len;
- }
- if (p + len == s) return s;
- return p;
-#else
-
- if (code == REGCODE_ASCII) {
- return p;
- }
- else if (code == REGCODE_EUCJP) {
- while (!eucjp_islead(*p) && p > start) p--;
- len = mblen(code, *p);
- if (p + len > s) return p;
- p += len;
- return p + ((s - p) & ~1);
- }
- else if (code == REGCODE_SJIS) {
- if (sjis_ismbtrail(*p)) {
- while (p > start) {
- if (! sjis_ismbfirst(*--p)) {
- p++;
- break;
- }
- }
- }
- len = mblen(code, *p);
- if (p + len > s) return p;
- p += len;
- return p + ((s - p) & ~1);
- }
- else { /* REGCODE_UTF8 */
- while (!utf8_islead(*p) && p > start) p--;
- return p;
- }
-#endif /* REG_RUBY_M17N */
+ return ONIGERR_UNEXPECTED_BYTECODE;
}
-extern UChar*
-regex_get_right_adjust_char_head(RegCharEncoding code, UChar* start, UChar* s)
-{
- UChar* p = regex_get_left_adjust_char_head(code, start, s);
-
- if (p < s) {
- p += mblen(code, *p);
- }
- return p;
-}
static UChar*
-get_right_adjust_char_head_with_prev(RegCharEncoding code,
- UChar* start, UChar* s, UChar** prev)
-{
- UChar* p = regex_get_left_adjust_char_head(code, start, s);
-
- if (p < s) {
- if (prev) *prev = p;
- p += mblen(code, *p);
- }
- else {
- if (prev) *prev = (UChar* )NULL; /* Sorry */
- }
- return p;
-}
-
-extern UChar*
-regex_get_prev_char_head(RegCharEncoding code, UChar* start, UChar* s)
-{
- if (s <= start)
- return (UChar* )NULL;
-
- return regex_get_left_adjust_char_head(code, start, s - 1);
-}
-
-static UChar*
-step_backward_char(RegCharEncoding code, UChar* start, UChar* s, int n)
-{
- while (IS_NOT_NULL(s) && n-- > 0) {
- if (s <= start)
- return (UChar* )NULL;
-
- s = regex_get_left_adjust_char_head(code, start, s - 1);
- }
- return s;
-}
-
-static UChar*
-slow_search(RegCharEncoding code, UChar* target, UChar* target_end,
+slow_search(OnigEncoding enc, UChar* target, UChar* target_end,
UChar* text, UChar* text_end, UChar* text_range)
{
UChar *t, *p, *s, *end;
if (t == target_end)
return s;
}
- s += mblen(code, *s);
+ s += enc_len(enc, *s);
}
return (UChar* )NULL;
}
+#if 0
static int
-str_trans_match_after_head_byte(RegCharEncoding code,
+str_trans_match_after_head_byte(OnigEncoding enc,
int len, UChar* t, UChar* tend, UChar* p)
{
while (--len > 0) {
}
if (len == 0) {
+ int lowlen;
+ UChar *q, lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
+
while (t < tend) {
- len = mblen(code, *p);
- if (len == 1) {
- if (*t != TOLOWER(code, *p))
- break;
- p++;
- t++;
- }
- else {
- if (*t != *p++) break;
- t++;
- while (--len > 0) {
- if (*t != *p) break;
- t++; p++;
- }
- if (len > 0) break;
- }
+ len = enc_len(enc, *p);
+ lowlen = ONIGENC_MBC_TO_LOWER(enc, p, lowbuf);
+ q = lowbuf;
+ while (lowlen > 0) {
+ if (*t++ != *q++) break;
+ lowlen--;
+ }
+ if (lowlen > 0) break;
+ p += len;
}
if (t == tend)
return 1;
return 0;
}
+#endif
+
+static int
+str_lower_case_match(OnigEncoding enc, UChar* t, UChar* tend, UChar* p)
+{
+ int len, lowlen;
+ UChar *q, lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
+
+ while (t < tend) {
+ len = enc_len(enc, *p);
+ lowlen = ONIGENC_MBC_TO_LOWER(enc, p, lowbuf);
+ q = lowbuf;
+ while (lowlen > 0) {
+ if (*t++ != *q++) return 0;
+ lowlen--;
+ }
+ p += len;
+ }
+
+ return 1;
+}
static UChar*
-slow_search_ic(RegCharEncoding code,
+slow_search_ic(OnigEncoding enc,
UChar* target, UChar* target_end,
UChar* text, UChar* text_end, UChar* text_range)
{
- int len;
+ int len, lowlen;
UChar *t, *p, *s, *end;
+ UChar lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
end = text_end - (target_end - target) + 1;
if (end > text_range)
s = text;
while (s < end) {
- len = mblen(code, *s);
- if (*s == *target || (len == 1 && TOLOWER(code, *s) == *target)) {
- p = s + 1;
+ len = enc_len(enc, *s);
+ lowlen = ONIGENC_MBC_TO_LOWER(enc, s, lowbuf);
+ if (*target == *lowbuf) {
+ p = lowbuf + 1;
t = target + 1;
- if (str_trans_match_after_head_byte(code, len, t, target_end, p))
- return s;
+ while (--lowlen > 0) {
+ if (*p != *t) break;
+ p++; *t++;
+ }
+ if (lowlen == 0) {
+ if (str_lower_case_match(enc, t, target_end, s + len))
+ return s;
+ }
}
+
s += len;
}
}
static UChar*
-slow_search_backward(RegCharEncoding code, UChar* target, UChar* target_end,
+slow_search_backward(OnigEncoding enc, UChar* target, UChar* target_end,
UChar* text, UChar* adjust_text, UChar* text_end, UChar* text_start)
{
UChar *t, *p, *s;
if (s > text_start)
s = text_start;
else
- s = regex_get_left_adjust_char_head(code, adjust_text, s);
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);
while (s >= text) {
if (*s == *target) {
if (t == target_end)
return s;
}
- s = regex_get_prev_char_head(code, adjust_text, s);
+ s = onigenc_get_prev_char_head(enc, adjust_text, s);
}
return (UChar* )NULL;
}
static UChar*
-slow_search_backward_ic(RegCharEncoding code,
+slow_search_backward_ic(OnigEncoding enc,
UChar* target,UChar* target_end,
UChar* text, UChar* adjust_text,
UChar* text_end, UChar* text_start)
{
- int len;
+ int len, lowlen;
UChar *t, *p, *s;
+ UChar lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
s = text_end - (target_end - target);
if (s > text_start)
s = text_start;
else
- s = regex_get_left_adjust_char_head(code, adjust_text, s);
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);
while (s >= text) {
- len = mblen(code, *s);
- if (*s == *target || (len == 1 && TOLOWER(code, *s) == *target)) {
- p = s + 1;
+ len = enc_len(enc, *s);
+ lowlen = ONIGENC_MBC_TO_LOWER(enc, s, lowbuf);
+ if (*target == *lowbuf) {
+ p = lowbuf + 1;
t = target + 1;
- if (str_trans_match_after_head_byte(code, len, t, target_end, p))
- return s;
+ while (--lowlen > 0) {
+ if (*p != *t) break;
+ p++; *t++;
+ }
+ if (lowlen == 0) {
+ if (str_lower_case_match(enc, t, target_end, s + len))
+ return s;
+ }
}
- s = regex_get_prev_char_head(code, adjust_text, s);
+
+ s = onigenc_get_prev_char_head(enc, adjust_text, s);
}
return (UChar* )NULL;
tail = target_end - 1;
s = text;
while ((s - text) < target_end - target) {
- s += mblen(reg->enc, *s);
+ s += enc_len(reg->enc, *s);
}
s--; /* set to text check tail position. */
p++;
t = p;
while ((p - t) < skip) {
- p += mblen(reg->enc, *p);
+ p += enc_len(reg->enc, *p);
}
s += (p - t);
}
p++;
t = p;
while ((p - t) < skip) {
- p += mblen(reg->enc, *p);
+ p += enc_len(reg->enc, *p);
}
s += (p - t);
}
}
static int
-set_bm_backward_skip(UChar* s, UChar* end, RegCharEncoding enc,
+set_bm_backward_skip(UChar* s, UChar* end, OnigEncoding enc,
int ignore_case, int** skip)
{
int i, len;
+ UChar lowbuf[ONIGENC_MBC_TO_LOWER_MAXLEN];
if (IS_NULL(*skip)) {
- *skip = (int* )xmalloc(sizeof(int) * REG_CHAR_TABLE_SIZE);
- if (IS_NULL(*skip)) return REGERR_MEMORY;
+ *skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);
+ if (IS_NULL(*skip)) return ONIGERR_MEMORY;
}
len = end - s;
- for (i = 0; i < REG_CHAR_TABLE_SIZE; i++)
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
(*skip)[i] = len;
if (ignore_case) {
- for (i = len - 1; i > 0; i--)
- (*skip)[TOLOWER(enc, s[i])] = i;
+ for (i = len - 1; i > 0; i--) {
+ ONIGENC_MBC_TO_LOWER(enc, &(s[i]), lowbuf);
+ (*skip)[*lowbuf] = i;
+ }
}
else {
for (i = len - 1; i > 0; i--)
if (text_start < s)
s = text_start;
else
- s = regex_get_left_adjust_char_head(reg->enc, adjust_text, s);
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);
while (s >= text) {
p = s;
return s;
s -= reg->int_map_backward[*s];
- s = regex_get_left_adjust_char_head(reg->enc, adjust_text, s);
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);
}
return (UChar* )NULL;
}
static UChar*
-map_search(RegCharEncoding code, UChar map[], UChar* text, UChar* text_range)
+map_search(OnigEncoding enc, UChar map[], UChar* text, UChar* text_range)
{
UChar *s = text;
while (s < text_range) {
if (map[*s]) return s;
- s += mblen(code, *s);
+ s += enc_len(enc, *s);
}
return (UChar* )NULL;
}
static UChar*
-map_search_backward(RegCharEncoding code, UChar map[],
+map_search_backward(OnigEncoding enc, UChar map[],
UChar* text, UChar* adjust_text, UChar* text_start)
{
UChar *s = text_start;
while (s >= text) {
if (map[*s]) return s;
- s = regex_get_prev_char_head(code, adjust_text, s);
+ s = onigenc_get_prev_char_head(enc, adjust_text, s);
}
return (UChar* )NULL;
}
extern int
-regex_match(regex_t* reg, UChar* str, UChar* end, UChar* at, RegRegion* region,
- RegOptionType option)
+onig_match(regex_t* reg, UChar* str, UChar* end, UChar* at, OnigRegion* region,
+ OnigOptionType option)
{
int r;
UChar *prev;
MATCH_ARG_INIT(msa, option, region, at);
- if (region && !IS_POSIX_REGION(option))
- r = regex_region_resize(region, reg->num_mem + 1);
+ if (region
+#ifdef USE_POSIX_REGION_OPTION
+ && !IS_POSIX_REGION(option)
+#endif
+ ) {
+ r = onig_region_resize(region, reg->num_mem + 1);
+ }
else
r = 0;
if (r == 0) {
- prev = regex_get_prev_char_head(reg->enc, str, at);
+ prev = onigenc_get_prev_char_head(reg->enc, str, at);
r = match_at(reg, str, end, at, prev, &msa);
}
MATCH_ARG_FREE(msa);
{
UChar *p, *pprev = (UChar* )NULL;
-#ifdef REG_DEBUG_SEARCH
+#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "forward_search_range: str: %d, end: %d, s: %d, range: %d\n",
(int )str, (int )end, (int )s, (int )range);
#endif
p = s;
if (reg->dmin > 0) {
- if (IS_SINGLEBYTE_CODE(reg->enc)) {
+ if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {
p += reg->dmin;
}
else {
UChar *q = p + reg->dmin;
- while (p < q) p += mblen(reg->enc, *p);
+ while (p < q) p += enc_len(reg->enc, *p);
}
}
retry:
switch (reg->optimize) {
- case REG_OPTIMIZE_EXACT:
+ case ONIG_OPTIMIZE_EXACT:
p = slow_search(reg->enc, reg->exact, reg->exact_end, p, end, range);
break;
- case REG_OPTIMIZE_EXACT_IC:
+ case ONIG_OPTIMIZE_EXACT_IC:
p = slow_search_ic(reg->enc, reg->exact, reg->exact_end, p, end, range);
break;
- case REG_OPTIMIZE_EXACT_BM:
+ case ONIG_OPTIMIZE_EXACT_BM:
p = bm_search(reg, reg->exact, reg->exact_end, p, end, range);
break;
- case REG_OPTIMIZE_EXACT_BM_NOT_REV:
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:
p = bm_search_notrev(reg, reg->exact, reg->exact_end, p, end, range);
break;
- case REG_OPTIMIZE_MAP:
+ case ONIG_OPTIMIZE_MAP:
p = map_search(reg->enc, reg->map, p, range);
break;
}
if (p - reg->dmin < s) {
retry_gate:
pprev = p;
- p += mblen(reg->enc, *p);
+ p += enc_len(reg->enc, *p);
goto retry;
}
switch (reg->sub_anchor) {
case ANCHOR_BEGIN_LINE:
if (!ON_STR_BEGIN(p)) {
- prev = regex_get_prev_char_head(reg->enc, (pprev ? pprev : str), p);
- if (!IS_NEWLINE(*prev))
+ prev = onigenc_get_prev_char_head(reg->enc,
+ (pprev ? pprev : str), p);
+ if (!ONIG_IS_NEWLINE(*prev))
goto retry_gate;
}
break;
case ANCHOR_END_LINE:
if (ON_STR_END(p)) {
- prev = regex_get_prev_char_head(reg->enc, (pprev ? pprev : str), p);
- if (prev && IS_NEWLINE(*prev))
+ prev = onigenc_get_prev_char_head(reg->enc,
+ (pprev ? pprev : str), p);
+ if (prev && ONIG_IS_NEWLINE(*prev))
goto retry_gate;
}
- else if (!IS_NEWLINE(*p))
+ else if (!ONIG_IS_NEWLINE(*p))
goto retry_gate;
break;
}
*low = p;
if (low_prev) {
if (*low > s)
- *low_prev = regex_get_prev_char_head(reg->enc, s, p);
+ *low_prev = onigenc_get_prev_char_head(reg->enc, s, p);
else
- *low_prev = regex_get_prev_char_head(reg->enc,
- (pprev ? pprev : str), p);
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
+ (pprev ? pprev : str), p);
}
}
else {
- if (reg->dmax != INFINITE_DISTANCE) {
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {
*low = p - reg->dmax;
if (*low > s) {
- *low = get_right_adjust_char_head_with_prev(reg->enc, s,
- *low, low_prev);
+ *low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s,
+ *low, low_prev);
if (low_prev && IS_NULL(*low_prev))
- *low_prev = regex_get_prev_char_head(reg->enc,
- (pprev ? pprev : s), *low);
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
+ (pprev ? pprev : s), *low);
}
else {
if (low_prev)
- *low_prev = regex_get_prev_char_head(reg->enc,
- (pprev ? pprev : str), *low);
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
+ (pprev ? pprev : str), *low);
}
}
}
/* no needs to adjust *high, *high is used as range check only */
*high = p - reg->dmin;
-#ifdef REG_DEBUG_SEARCH
+#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr,
"forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\n",
(int )(*low - str), (int )(*high - str), reg->dmin, reg->dmax);
return 0; /* fail */
}
-static int set_bm_backward_skip P_((UChar* s, UChar* end, RegCharEncoding enc,
+static int set_bm_backward_skip P_((UChar* s, UChar* end, OnigEncoding enc,
int ignore_case, int** skip));
#define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD 100
retry:
switch (reg->optimize) {
- case REG_OPTIMIZE_EXACT:
+ case ONIG_OPTIMIZE_EXACT:
exact_method:
p = slow_search_backward(reg->enc, reg->exact, reg->exact_end,
range, adjrange, end, p);
break;
- case REG_OPTIMIZE_EXACT_IC:
+ case ONIG_OPTIMIZE_EXACT_IC:
p = slow_search_backward_ic(reg->enc, reg->exact,
reg->exact_end, range, adjrange, end, p);
break;
- case REG_OPTIMIZE_EXACT_BM:
- case REG_OPTIMIZE_EXACT_BM_NOT_REV:
+ case ONIG_OPTIMIZE_EXACT_BM:
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:
if (IS_NULL(reg->int_map_backward)) {
if (s - range < BM_BACKWARD_SEARCH_LENGTH_THRESHOLD)
goto exact_method;
end, p);
break;
- case REG_OPTIMIZE_MAP:
+ case ONIG_OPTIMIZE_MAP:
p = map_search_backward(reg->enc, reg->map, range, adjrange, p);
break;
}
switch (reg->sub_anchor) {
case ANCHOR_BEGIN_LINE:
if (!ON_STR_BEGIN(p)) {
- prev = regex_get_prev_char_head(reg->enc, adjrange, p);
- if (!IS_NEWLINE(*prev)) {
+ prev = onigenc_get_prev_char_head(reg->enc, adjrange, p);
+ if (!ONIG_IS_NEWLINE(*prev)) {
p = prev;
goto retry;
}
case ANCHOR_END_LINE:
if (ON_STR_END(p)) {
- prev = regex_get_prev_char_head(reg->enc, adjrange, p);
+ prev = onigenc_get_prev_char_head(reg->enc, adjrange, p);
if (IS_NULL(prev)) goto fail;
- if (IS_NEWLINE(*prev)) {
+ if (ONIG_IS_NEWLINE(*prev)) {
p = prev;
goto retry;
}
}
- else if (!IS_NEWLINE(*p)) {
- p = regex_get_prev_char_head(reg->enc, adjrange, p);
+ else if (!ONIG_IS_NEWLINE(*p)) {
+ p = onigenc_get_prev_char_head(reg->enc, adjrange, p);
if (IS_NULL(p)) goto fail;
goto retry;
}
}
/* no needs to adjust *high, *high is used as range check only */
- if (reg->dmax != INFINITE_DISTANCE) {
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {
*low = p - reg->dmax;
*high = p - reg->dmin;
- *high = regex_get_right_adjust_char_head(reg->enc, adjrange, *high);
+ *high = onigenc_get_right_adjust_char_head(reg->enc, adjrange, *high);
}
-#ifdef REG_DEBUG_SEARCH
+#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "backward_search_range: low: %d, high: %d\n",
(int )(*low - str), (int )(*high - str));
#endif
}
fail:
-#ifdef REG_DEBUG_SEARCH
+#ifdef ONIG_DEBUG_SEARCH
fprintf(stderr, "backward_search_range: fail.\n");
#endif
return 0; /* fail */
extern int
-regex_search(regex_t* reg, UChar* str, UChar* end,
- UChar* start, UChar* range, RegRegion* region, RegOptionType option)
+onig_search(regex_t* reg, UChar* str, UChar* end,
+ UChar* start, UChar* range, OnigRegion* region, OnigOptionType option)
{
int r;
UChar *s, *prev;
MatchArg msa;
- if (REG_STATE(reg) == REG_STATE_NORMAL) {
+ if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {
reg->state++; /* increment as search counter */
if (IS_NOT_NULL(reg->chain)) {
- regex_chain_reduce(reg);
+ onig_chain_reduce(reg);
reg->state++;
}
}
else {
int n = 0;
- while (REG_STATE(reg) < REG_STATE_NORMAL) {
+ while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {
if (++n > THREAD_PASS_LIMIT_COUNT)
- return REGERR_OVER_THREAD_PASS_LIMIT_COUNT;
+ return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;
THREAD_PASS;
}
reg->state++; /* increment as search counter */
}
-#ifdef REG_DEBUG_SEARCH
- fprintf(stderr, "regex_search (entry point): str: %d, end: %d, start: %d, range: %d\n",
+#ifdef ONIG_DEBUG_SEARCH
+ fprintf(stderr, "onig_search (entry point): str: %d, end: %d, start: %d, range: %d\n",
(int )str, (int )(end - str), (int )(start - str), (int )(range - str));
#endif
- if (region && !IS_POSIX_REGION(option)) {
- r = regex_region_resize(region, reg->num_mem + 1);
+ if (region
+#ifdef USE_POSIX_REGION_OPTION
+ && !IS_POSIX_REGION(option)
+#endif
+ ) {
+ r = onig_region_resize(region, reg->num_mem + 1);
if (r) goto finish_no_msa;
}
#define MATCH_AND_RETURN_CHECK \
r = match_at(reg, str, end, s, prev, &msa);\
- if (r != REG_MISMATCH) {\
+ if (r != ONIG_MISMATCH) {\
if (r >= 0) goto match;\
goto finish; /* error */ \
}
if (semi_end - start > reg->anchor_dmax) {
start = semi_end - reg->anchor_dmax;
if (start < end)
- start = regex_get_right_adjust_char_head(reg->enc, str, start);
+ start = onigenc_get_right_adjust_char_head(reg->enc, str, start);
else { /* match with empty at end */
- start = regex_get_prev_char_head(reg->enc, str, end);
+ start = onigenc_get_prev_char_head(reg->enc, str, end);
}
}
if (semi_end - (range - 1) < reg->anchor_dmin) {
}
if (semi_end - start < reg->anchor_dmin) {
start = semi_end - reg->anchor_dmin;
- start = regex_get_left_adjust_char_head(reg->enc, str, start);
+ start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, start);
if (range > start) goto mismatch_no_msa;
}
}
}
else if (reg->anchor & ANCHOR_SEMI_END_BUF) {
- if (IS_NEWLINE(end[-1])) {
+ if (ONIG_IS_NEWLINE(end[-1])) {
semi_end = end - 1;
if (semi_end > str && start <= semi_end) {
goto end_buf;
else if (str == end) { /* empty string */
static UChar* address_for_empty_string = "";
-#ifdef REG_DEBUG_SEARCH
- fprintf(stderr, "regex_search: empty string.\n");
+#ifdef ONIG_DEBUG_SEARCH
+ fprintf(stderr, "onig_search: empty string.\n");
#endif
if (reg->threshold_len == 0) {
goto mismatch_no_msa;
}
-#ifdef REG_DEBUG_SEARCH
- fprintf(stderr, "regex_search(apply anchor): end: %d, start: %d, range: %d\n",
+#ifdef ONIG_DEBUG_SEARCH
+ fprintf(stderr, "onig_search(apply anchor): end: %d, start: %d, range: %d\n",
(int )(end - str), (int )(start - str), (int )(range - str));
#endif
s = start;
if (range > start) { /* forward search */
if (s > str)
- prev = regex_get_prev_char_head(reg->enc, str, s);
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
else
prev = (UChar* )NULL;
- if (reg->optimize != REG_OPTIMIZE_NONE) {
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {
UChar *sch_range, *low, *high, *low_prev;
sch_range = range;
if (reg->dmax != 0) {
- if (reg->dmax == INFINITE_DISTANCE)
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)
sch_range = end;
else {
sch_range += reg->dmax;
if (sch_range > end) sch_range = end;
}
}
- if (reg->dmax != INFINITE_DISTANCE &&
+ if (reg->dmax != ONIG_INFINITE_DISTANCE &&
(end - start) >= reg->threshold_len) {
do {
if (! forward_search_range(reg, str, end, s, sch_range,
while (s <= high) {
MATCH_AND_RETURN_CHECK;
prev = s;
- s += mblen(reg->enc, *s);
+ s += enc_len(reg->enc, *s);
}
if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) {
if (IS_NOT_NULL(prev)) {
- while (!IS_NEWLINE(*prev) && s < range) {
+ while (!ONIG_IS_NEWLINE(*prev) && s < range) {
prev = s;
- s += mblen(reg->enc, *s);
+ s += enc_len(reg->enc, *s);
}
}
}
do {
MATCH_AND_RETURN_CHECK;
prev = s;
- s += mblen(reg->enc, *s);
+ s += enc_len(reg->enc, *s);
} while (s <= range); /* exec s == range, because empty match with /$/. */
}
else { /* backward search */
- if (reg->optimize != REG_OPTIMIZE_NONE) {
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {
UChar *low, *high, *adjrange, *sch_start;
- adjrange = regex_get_left_adjust_char_head(reg->enc, str, range);
- if (reg->dmax != INFINITE_DISTANCE &&
+ adjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, range);
+ if (reg->dmax != ONIG_INFINITE_DISTANCE &&
(end - range) >= reg->threshold_len) {
do {
sch_start = s + reg->dmax;
s = high;
while (s >= low) {
- prev = regex_get_prev_char_head(reg->enc, str, s);
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
MATCH_AND_RETURN_CHECK;
s = prev;
}
sch_start = s;
if (reg->dmax != 0) {
- if (reg->dmax == INFINITE_DISTANCE)
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)
sch_start = end;
else {
sch_start += reg->dmax;
if (sch_start > end) sch_start = end;
else
- sch_start = regex_get_left_adjust_char_head(reg->enc, start,
- sch_start);
+ sch_start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc,
+ start, sch_start);
}
}
if (backward_search_range(reg, str, end, sch_start, range, adjrange,
}
do {
- prev = regex_get_prev_char_head(reg->enc, str, s);
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
MATCH_AND_RETURN_CHECK;
s = prev;
} while (s >= range);
}
mismatch:
- r = REG_MISMATCH;
+ r = ONIG_MISMATCH;
finish:
MATCH_ARG_FREE(msa);
/* If result is mismatch and no FIND_NOT_EMPTY option,
then the region is not setted in match_at(). */
- if (IS_FIND_NOT_EMPTY(reg->options) && region && !IS_POSIX_REGION(option))
- regex_region_clear(region);
+ if (IS_FIND_NOT_EMPTY(reg->options) && region
+#ifdef USE_POSIX_REGION_OPTION
+ && !IS_POSIX_REGION(option)
+#endif
+ ) {
+ onig_region_clear(region);
+ }
-#ifdef REG_DEBUG
- if (r != REG_MISMATCH)
- fprintf(stderr, "regex_search: error %d\n", r);
+#ifdef ONIG_DEBUG
+ if (r != ONIG_MISMATCH)
+ fprintf(stderr, "onig_search: error %d\n", r);
#endif
return r;
mismatch_no_msa:
- r = REG_MISMATCH;
+ r = ONIG_MISMATCH;
finish_no_msa:
reg->state--; /* decrement as search counter */
-#ifdef REG_DEBUG
- if (r != REG_MISMATCH)
- fprintf(stderr, "regex_search: error %d\n", r);
+#ifdef ONIG_DEBUG
+ if (r != ONIG_MISMATCH)
+ fprintf(stderr, "onig_search: error %d\n", r);
#endif
return r;
return s - str;
}
+extern OnigEncoding
+onig_get_encoding(regex_t* reg)
+{
+ return reg->enc;
+}
+
+extern OnigOptionType
+onig_get_options(regex_t* reg)
+{
+ return reg->options;
+}
+
+extern OnigSyntaxType*
+onig_get_syntax(regex_t* reg)
+{
+ return reg->syntax;
+}
+
extern const char*
-regex_version(void)
+onig_version(void)
{
#define MSTR(a) # a
reggnu.c - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "regint.h"
+#ifndef ONIGGNU_H /* name changes from oniggnu.h to regex.h in ruby. */
+#include "oniggnu.h"
+#endif
+
#if defined(RUBY_PLATFORM) || defined(RUBY)
-#ifndef REG_RUBY_M17N
+#ifndef ONIG_RUBY_M17N
#define USE_COMPATIBILITY_FOR_RUBY_EXTENSION_LIBRARY
#endif
#endif
#endif
extern void
-re_free_registers(RegRegion* r)
+re_free_registers(OnigRegion* r)
{
/* 0: don't free self */
- regex_region_free(r, 0);
+ onig_region_free(r, 0);
}
extern int
re_adjust_startpos(regex_t* reg, const char* string, int size,
int startpos, int range)
{
- if (startpos > 0 && mbmaxlen(reg->enc) != 1 && startpos < size) {
+ if (startpos > 0 && ONIGENC_MBC_MAXLEN(reg->enc) != 1 && startpos < size) {
UChar *p;
UChar *s = (UChar* )string + startpos;
if (range > 0) {
- p = regex_get_right_adjust_char_head(reg->enc, (UChar* )string, s);
+ p = onigenc_get_right_adjust_char_head(reg->enc, (UChar* )string, s);
}
else {
- p = regex_get_left_adjust_char_head(reg->enc, (UChar* )string, s);
+ p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, (UChar* )string, s);
}
return p - (UChar* )string;
}
re_match(regex_t* reg, const char* str, int size, int pos,
struct re_registers* regs)
{
- return regex_match(reg, (UChar* )str, (UChar* )(str + size),
- (UChar* )(str + pos), regs, REG_OPTION_NONE);
+ return onig_match(reg, (UChar* )str, (UChar* )(str + size),
+ (UChar* )(str + pos), regs, ONIG_OPTION_NONE);
}
extern int
re_search(regex_t* bufp, const char* string, int size, int startpos, int range,
struct re_registers* regs)
{
- return regex_search(bufp, (UChar* )string, (UChar* )(string + size),
- (UChar* )(string + startpos),
- (UChar* )(string + startpos + range), regs, REG_OPTION_NONE);
+ return onig_search(bufp, (UChar* )string, (UChar* )(string + size),
+ (UChar* )(string + startpos),
+ (UChar* )(string + startpos + range),
+ regs, ONIG_OPTION_NONE);
}
extern int
re_compile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)
{
int r;
- RegErrorInfo einfo;
+ OnigErrorInfo einfo;
- r = regex_compile(reg, (UChar* )pattern, (UChar* )(pattern + size), &einfo);
+ r = onig_compile(reg, (UChar* )pattern, (UChar* )(pattern + size), &einfo);
if (r != 0) {
if (IS_NOT_NULL(ebuf))
- (void )regex_error_code_to_str((UChar* )ebuf, r, &einfo);
+ (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);
}
return r;
re_recompile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)
{
int r;
- RegErrorInfo einfo;
- RegCharEncoding enc;
+ OnigErrorInfo einfo;
+ OnigEncoding enc;
/* I think encoding and options should be arguments of this function.
But this is adapted to present re.c. (2002/11/29)
*/
- enc = RegDefaultCharEncoding;
+ enc = OnigEncDefaultCharEncoding;
- r = regex_recompile(reg, (UChar* )pattern, (UChar* )(pattern + size),
- reg->options, enc, RegDefaultSyntax, &einfo);
+ r = onig_recompile(reg, (UChar* )pattern, (UChar* )(pattern + size),
+ reg->options, enc, OnigDefaultSyntax, &einfo);
if (r != 0) {
if (IS_NOT_NULL(ebuf))
- (void )regex_error_code_to_str((UChar* )ebuf, r, &einfo);
+ (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);
}
return r;
}
extern void
re_free_pattern(regex_t* reg)
{
- regex_free(reg);
+ onig_free(reg);
}
extern int
re_alloc_pattern(regex_t** reg)
{
- if (RegDefaultCharEncoding == REGCODE_UNDEF)
- return REGERR_DEFAULT_ENCODING_IS_NOT_SETTED;
-
- return regex_alloc_init(reg, REG_OPTION_DEFAULT, RegDefaultCharEncoding,
- RegDefaultSyntax);
+ return onig_alloc_init(reg, ONIG_OPTION_DEFAULT, OnigEncDefaultCharEncoding,
+ OnigDefaultSyntax);
}
extern void
re_set_casetable(const char* table)
{
- regex_set_default_trans_table((UChar* )table);
+ onigenc_set_default_caseconv_table((UChar* )table);
}
#ifdef USE_COMPATIBILITY_FOR_RUBY_EXTENSION_LIBRARY
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#endif
extern void
-#ifdef REG_RUBY_M17N
-re_mbcinit(RegCharEncoding enc)
+#ifdef ONIG_RUBY_M17N
+re_mbcinit(OnigEncoding enc)
#else
re_mbcinit(int mb_code)
#endif
{
-#ifdef REG_RUBY_M17N
- RegDefaultCharEncoding = enc;
+#ifdef ONIG_RUBY_M17N
+
+ onigenc_set_default_encoding(enc);
+
#else
- RegDefaultCharEncoding = REG_MBLEN_TABLE[mb_code];
+
+ OnigEncoding enc;
+
+ switch (mb_code) {
+ case MBCTYPE_ASCII:
+ enc = ONIG_ENCODING_ASCII;
+ break;
+ case MBCTYPE_EUC:
+ enc = ONIG_ENCODING_EUC_JP;
+ break;
+ case MBCTYPE_SJIS:
+ enc = ONIG_ENCODING_SJIS;
+ break;
+ case MBCTYPE_UTF8:
+ enc = ONIG_ENCODING_UTF8;
+ break;
+ default:
+ return ;
+ break;
+ }
+
+ onigenc_set_default_encoding(enc);
#endif
#ifdef USE_COMPATIBILITY_FOR_RUBY_EXTENSION_LIBRARY
regint.h - Oniguruma (regular expression library)
- Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2002-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#ifndef REGINT_H
#define REGINT_H
/* for debug */
-/* #define REG_DEBUG_PARSE_TREE */
-/* #define REG_DEBUG_COMPILE */
-/* #define REG_DEBUG_SEARCH */
-/* #define REG_DEBUG_MATCH */
-/* #define REG_DONT_OPTIMIZE */
+/* #define ONIG_DEBUG_PARSE_TREE */
+/* #define ONIG_DEBUG_COMPILE */
+/* #define ONIG_DEBUG_SEARCH */
+/* #define ONIG_DEBUG_MATCH */
+/* #define ONIG_DONT_OPTIMIZE */
/* for byte-code statistical data. */
-/* #define REG_DEBUG_STATISTICS */
+/* #define ONIG_DEBUG_STATISTICS */
-#if defined(REG_DEBUG_PARSE_TREE) || defined(REG_DEBUG_MATCH) || \
- defined(REG_DEBUG_COMPILE) || defined(REG_DEBUG_STATISTICS)
-#ifndef REG_DEBUG
-#define REG_DEBUG
+#if defined(ONIG_DEBUG_PARSE_TREE) || defined(ONIG_DEBUG_MATCH) || \
+ defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_STATISTICS)
+#ifndef ONIG_DEBUG
+#define ONIG_DEBUG
#endif
#endif
#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
(defined(__ppc__) && defined(__APPLE__)) || \
+ defined(__x86_64) || defined(__x86_64__) || \
defined(__mc68020__)
-#define UNALIGNED_WORD_ACCESS
+#define PLATFORM_UNALIGNED_WORD_ACCESS
#endif
/* config */
-#define USE_NAMED_SUBEXP
+/* spec. config */
+#define USE_NAMED_GROUP
#define USE_SUBEXP_CALL
+#define USE_FOLD_MATCH /* ess-tsett etc... */
+#define USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK /* /(?:()|())*\2/ */
+#define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE /* /\n$/ =~ "\n" */
+#define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
+/* internal config */
+#define USE_RECYCLE_NODE
#define USE_OP_PUSH_OR_JUMP_EXACT
#define USE_QUALIFIER_PEEK_NEXT
-#define USE_RECYCLE_NODE
-#define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE /* /\n$/ =~ "\n" */
-/* #define USE_SBMB_CLASS */
#define INIT_MATCH_STACK_SIZE 160
-#define MATCH_STACK_LIMIT_SIZE 200000
+#define MATCH_STACK_LIMIT_SIZE 500000
/* interface to external system */
#ifdef NOT_RUBY /* gived from Makefile */
#include "config.h"
+#define USE_VARIABLE_META_CHARS
#define USE_VARIABLE_SYNTAX
#define USE_WORD_BEGIN_END /* "\<": word-begin, "\>": word-end */
-#define DEFAULT_TRANSTABLE_EXIST 1
-#define THREAD_ATOMIC_START /* depend on thread system */
-#define THREAD_ATOMIC_END /* depend on thread system */
-#define THREAD_PASS /* depend on thread system */
+#define USE_POSIX_REGION_OPTION /* needed for POSIX API support */
+#define THREAD_ATOMIC_START /* depend on thread system */
+#define THREAD_ATOMIC_END /* depend on thread system */
+#define THREAD_PASS /* depend on thread system */
#define xmalloc malloc
#define xrealloc realloc
#define xfree free
#include "ruby.h"
#include "version.h"
#include "rubysig.h" /* for DEFER_INTS, ENABLE_INTS */
-#define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
-#define THREAD_ATOMIC_START DEFER_INTS
-#define THREAD_ATOMIC_END ENABLE_INTS
-#define THREAD_PASS /* I want to use rb_thread_pass() */
-#define WARNING rb_warn
-#define VERB_WARNING rb_warning
+#define THREAD_ATOMIC_START DEFER_INTS
+#define THREAD_ATOMIC_END ENABLE_INTS
+#define THREAD_PASS rb_thread_schedule()
+#define DEFAULT_WARN_FUNCTION rb_warn
+#define DEFAULT_VERB_WARN_FUNCTION rb_warning
#if defined(RUBY_VERSION_MAJOR)
#if RUBY_VERSION_MAJOR > 1 || \
#endif
#endif
+#define ONIG_RUBY_DEFINE_GLOBAL_FUNCTION(s,f,n) \
+ rb_define_global_function(s, f, n)
#endif /* else NOT_RUBY */
#define THREAD_PASS_LIMIT_COUNT 10
#define xmemmove memmove
#if defined(_WIN32) && !defined(__CYGWIN__)
#define xalloca _alloca
+#ifdef NOT_RUBY
#define vsnprintf _vsnprintf
+#endif
#else
#define xalloca alloca
#endif
#include <ctype.h>
#include <sys/types.h>
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
# include <stdio.h>
#endif
-#ifdef NOT_RUBY
-# include "oniguruma.h"
-#else
-# include "regex.h"
-#endif
+#include "regenc.h"
+#include "oniguruma.h"
#ifdef MIN
#undef MIN
#define MIN(a,b) (((a)>(b))?(b):(a))
#define MAX(a,b) (((a)<(b))?(b):(a))
-#ifndef UNALIGNED_WORD_ACCESS
+#define IS_NULL(p) (((void*)(p)) == (void*)0)
+#define IS_NOT_NULL(p) (((void*)(p)) != (void*)0)
+#define CHECK_NULL_RETURN(p) if (IS_NULL(p)) return NULL
+#define CHECK_NULL_RETURN_VAL(p,val) if (IS_NULL(p)) return (val)
+#define NULL_UCHARP ((UChar* )0)
+
+#ifndef PLATFORM_UNALIGNED_WORD_ACCESS
#define WORD_ALIGNMENT_SIZE SIZEOF_INT
#define GET_ALIGNMENT_PAD_SIZE(addr,pad_size) do {\
- (pad_size) = WORD_ALIGNMENT_SIZE - ((int )(addr) % WORD_ALIGNMENT_SIZE);\
+ (pad_size) = WORD_ALIGNMENT_SIZE \
+ - ((unsigned int )(addr) % WORD_ALIGNMENT_SIZE);\
if ((pad_size) == WORD_ALIGNMENT_SIZE) (pad_size) = 0;\
} while (0)
#define ALIGNMENT_RIGHT(addr) do {\
(addr) += (WORD_ALIGNMENT_SIZE - 1);\
- (addr) -= ((int )(addr) % WORD_ALIGNMENT_SIZE);\
+ (addr) -= ((unsigned int )(addr) % WORD_ALIGNMENT_SIZE);\
} while (0)
#define SERIALIZE_UINT(i,p) SERIALIZE_8BYTE_INT(i,p)
#endif
-#endif /* UNALIGNED_WORD_ACCESS */
+#endif /* PLATFORM_UNALIGNED_WORD_ACCESS */
/* stack pop level */
#define STACK_POP_LEVEL_FREE 0
#define STACK_POP_LEVEL_ALL 2
/* optimize flags */
-#define REG_OPTIMIZE_NONE 0
-#define REG_OPTIMIZE_EXACT 1 /* Slow Search */
-#define REG_OPTIMIZE_EXACT_BM 2 /* Boyer Moore Search */
-#define REG_OPTIMIZE_EXACT_BM_NOT_REV 3 /* BM (but not simple match) */
-#define REG_OPTIMIZE_EXACT_IC 4 /* Slow Search (ignore case) */
-#define REG_OPTIMIZE_MAP 5 /* char map */
+#define ONIG_OPTIMIZE_NONE 0
+#define ONIG_OPTIMIZE_EXACT 1 /* Slow Search */
+#define ONIG_OPTIMIZE_EXACT_BM 2 /* Boyer Moore Search */
+#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV 3 /* BM (but not simple match) */
+#define ONIG_OPTIMIZE_EXACT_IC 4 /* Slow Search (ignore case) */
+#define ONIG_OPTIMIZE_MAP 5 /* char map */
/* bit status */
typedef unsigned int BitStatusType;
#define INT_MAX_LIMIT ((1UL << (SIZEOF_INT * 8 - 1)) - 1)
-typedef unsigned int WCINT;
-
-#define SIZE_WCINT sizeof(WCINT)
-#define GET_WCINT(wc,p) (wc) = *((WCINT* )(p))
-
-#define INFINITE_DISTANCE ~((RegDistance )0)
-
-#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
-# define IS_ASCII(c) 1
-#else
-# define IS_ASCII(c) isascii(c)
-#endif
-
-#ifdef isblank
-# define IS_BLANK(c) (IS_ASCII(c) && isblank(c))
-#else
-# define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
-#endif
-#ifdef isgraph
-# define IS_GRAPH(c) (IS_ASCII(c) && isgraph(c))
-#else
-# define IS_GRAPH(c) (IS_ASCII(c) && isprint(c) && !isspace(c))
-#endif
-
-#define IS_PRINT(c) (isprint(c) && IS_ASCII(c))
-#define IS_ALNUM(c) (isalnum(c) && IS_ASCII(c))
-#define IS_ALPHA(c) (isalpha(c) && IS_ASCII(c))
-#define IS_LOWER(c) (islower(c) && IS_ASCII(c))
-#define IS_UPPER(c) (isupper(c) && IS_ASCII(c))
-#define IS_CNTRL(c) (iscntrl(c) && IS_ASCII(c))
-#define IS_PUNCT(c) (ispunct(c) && IS_ASCII(c))
-#define IS_SPACE(c) (isspace(c) && IS_ASCII(c))
-#define IS_DIGIT(c) (isdigit(c) && IS_ASCII(c))
-#define IS_XDIGIT(c) (isxdigit(c) && IS_ASCII(c))
-#define IS_ODIGIT(c) (IS_DIGIT(c) && (c) < '8')
-
-#define DIGITVAL(c) ((c) - '0')
-#define ODIGITVAL(c) DIGITVAL(c)
-#define XDIGITVAL(c) \
- (IS_DIGIT(c) ? DIGITVAL(c) : (IS_UPPER(c) ? (c) - 'A' + 10 : (c) - 'a' + 10))
-
-#define IS_SINGLELINE(option) ((option) & REG_OPTION_SINGLELINE)
-#define IS_MULTILINE(option) ((option) & REG_OPTION_MULTILINE)
-#define IS_IGNORECASE(option) ((option) & REG_OPTION_IGNORECASE)
-#define IS_EXTEND(option) ((option) & REG_OPTION_EXTEND)
-#define IS_FIND_LONGEST(option) ((option) & REG_OPTION_FIND_LONGEST)
-#define IS_FIND_NOT_EMPTY(option) ((option) & REG_OPTION_FIND_NOT_EMPTY)
+#define DIGITVAL(code) ((code) - '0')
+#define ODIGITVAL(code) DIGITVAL(code)
+#define XDIGITVAL(enc,code) \
+ (ONIGENC_IS_CODE_DIGIT(enc,code) ? DIGITVAL(code) \
+ : (ONIGENC_IS_CODE_UPPER(enc,code) ? (code) - 'A' + 10 : (code) - 'a' + 10))
+
+#define IS_SINGLELINE(option) ((option) & ONIG_OPTION_SINGLELINE)
+#define IS_MULTILINE(option) ((option) & ONIG_OPTION_MULTILINE)
+#define IS_IGNORECASE(option) ((option) & ONIG_OPTION_IGNORECASE)
+#define IS_EXTEND(option) ((option) & ONIG_OPTION_EXTEND)
+#define IS_FIND_LONGEST(option) ((option) & ONIG_OPTION_FIND_LONGEST)
+#define IS_FIND_NOT_EMPTY(option) ((option) & ONIG_OPTION_FIND_NOT_EMPTY)
#define IS_POSIXLINE(option) (IS_SINGLELINE(option) && IS_MULTILINE(option))
#define IS_FIND_CONDITION(option) ((option) & \
- (REG_OPTION_FIND_LONGEST | REG_OPTION_FIND_NOT_EMPTY))
-#define IS_NOTBOL(option) ((option) & REG_OPTION_NOTBOL)
-#define IS_NOTEOL(option) ((option) & REG_OPTION_NOTEOL)
-#define IS_POSIX_REGION(option) ((option) & REG_OPTION_POSIX_REGION)
+ (ONIG_OPTION_FIND_LONGEST | ONIG_OPTION_FIND_NOT_EMPTY))
+#define IS_NOTBOL(option) ((option) & ONIG_OPTION_NOTBOL)
+#define IS_NOTEOL(option) ((option) & ONIG_OPTION_NOTEOL)
+#define IS_POSIX_REGION(option) ((option) & ONIG_OPTION_POSIX_REGION)
-#ifdef NEWLINE
-#undef NEWLINE
-#endif
-#define NEWLINE '\n'
-#define IS_NULL(p) (((void*)(p)) == (void*)0)
-#define IS_NOT_NULL(p) (((void*)(p)) != (void*)0)
-#define IS_NEWLINE(c) ((c) == NEWLINE)
-#define CHECK_NULL_RETURN(p) if (IS_NULL(p)) return NULL
-#define CHECK_NULL_RETURN_VAL(p,val) if (IS_NULL(p)) return (val)
+/* OP_SET_OPTION is required for these options.
+#define IS_DYNAMIC_OPTION(option) \
+ (((option) & (ONIG_OPTION_MULTILINE | ONIG_OPTION_IGNORECASE)) != 0)
+*/
+/* ignore-case and multibyte status are included in compiled code. */
+#define IS_DYNAMIC_OPTION(option) 0
-#define NULL_UCHARP ((UChar* )0)
/* bitset */
#define BITS_PER_BYTE 8
#define BITS_IN_ROOM (sizeof(Bits) * BITS_PER_BYTE)
#define BITSET_SIZE (SINGLE_BYTE_SIZE / BITS_IN_ROOM)
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
typedef unsigned int Bits;
#else
typedef unsigned char Bits;
unsigned int alloc;
} BBuf;
-#define BBUF_INIT(buf,size) regex_bbuf_init((BBuf* )(buf), (size))
+#define BBUF_INIT(buf,size) onig_bbuf_init((BBuf* )(buf), (size))
#define BBUF_SIZE_INC(buf,inc) do{\
(buf)->alloc += (inc);\
(buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\
- if (IS_NULL((buf)->p)) return(REGERR_MEMORY);\
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\
} while (0)
#define BBUF_EXPAND(buf,low) do{\
do { (buf)->alloc *= 2; } while ((buf)->alloc < low);\
(buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\
- if (IS_NULL((buf)->p)) return(REGERR_MEMORY);\
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\
} while (0)
#define BBUF_ENSURE_SIZE(buf,size) do{\
while (new_alloc < (size)) { new_alloc *= 2; }\
if ((buf)->alloc != new_alloc) {\
(buf)->p = (UChar* )xrealloc((buf)->p, new_alloc);\
- if (IS_NULL((buf)->p)) return(REGERR_MEMORY);\
+ if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\
(buf)->alloc = new_alloc;\
}\
} while (0)
#define BBUF_GET_BYTE(buf, pos) (buf)->p[(pos)]
-extern UChar* DefaultTransTable;
-#define TOLOWER(enc,c) (DefaultTransTable[c])
-
-/* methods for support multi-byte code, */
-#define ismb(code,c) (mblen((code),(c)) != 1)
-#define MB2WC(p,end,code) mb2wc((p),(end),(code))
-#define MBBACK(code,start,s,n) step_backward_char((code),(start),(s),(n))
-
-#ifdef REG_RUBY_M17N
-
-#define MB2WC_AVAILABLE(enc) 1
-#define WC2MB_FIRST(enc, wc) m17n_firstbyte((enc),(wc))
-
-#define mbmaxlen(enc) m17n_mbmaxlen(enc)
-#define mblen(enc,c) m17n_mbclen(enc,c)
-#define mbmaxlen_dist(enc) \
- (mbmaxlen(enc) > 0 ? mbmaxlen(enc) : INFINITE_DISTANCE)
-
-#define IS_SINGLEBYTE_CODE(enc) (m17n_mbmaxlen(enc) == 1)
-/* #define IS_INDEPENDENT_TRAIL(enc) m17n_independent_trail(enc) */
-#define IS_INDEPENDENT_TRAIL(enc) IS_SINGLEBYTE_CODE(enc)
-
-#define IS_CODE_ASCII(enc,c) IS_ASCII(c)
-#define IS_CODE_GRAPH(enc,c) IS_GRAPH(c)
-#define IS_CODE_PRINT(enc,c) m17n_isprint(enc,c)
-#define IS_CODE_ALNUM(enc,c) m17n_isalnum(enc,c)
-#define IS_CODE_ALPHA(enc,c) m17n_isalpha(enc,c)
-#define IS_CODE_LOWER(enc,c) m17n_islower(enc,c)
-#define IS_CODE_UPPER(enc,c) m17n_isupper(enc,c)
-#define IS_CODE_CNTRL(enc,c) m17n_iscntrl(enc,c)
-#define IS_CODE_PUNCT(enc,c) m17n_ispunct(enc,c)
-#define IS_CODE_SPACE(enc,c) m17n_isspace(enc,c)
-#define IS_CODE_BLANK(enc,c) IS_BLANK(c)
-#define IS_CODE_DIGIT(enc,c) m17n_isdigit(enc,c)
-#define IS_CODE_XDIGIT(enc,c) m17n_isxdigit(enc,c)
-
-#define IS_CODE_WORD(enc,c) m17n_iswchar(enc,c)
-#define ISNOT_CODE_WORD(enc,c) (!m17n_iswchar(enc,c))
-
-#define IS_WORD_STR(code,s,end) \
- (ismb((code),*(s)) ? (s + mblen((code),*(s)) <= (end)) : \
- m17n_iswchar(code,*(s)))
-#define IS_WORD_STR_INC(code,s,end) \
- (ismb((code),*(s)) ? ((s) += mblen((code),*(s)), (s) <= (end)) : \
- (s++, m17n_iswchar(code,s[-1])))
-
-#define IS_WORD_HEAD(enc,c) (ismb(enc,c) ? 1 : IS_CODE_WORD(enc,c))
-
-#define IS_SB_WORD(code,c) (mblen(code,c) == 1 && IS_CODE_WORD(code,c))
-#define IS_MB_WORD(code,c) ismb(code,c)
-
-#define mb2wc(p,e,enc) m17n_codepoint((enc),(p),(e))
-
-#else /* REG_RUBY_M17N */
-
-#define mb2wc(p,e,code) regex_mb2wc((p),(e),(code))
-
-#define MB2WC_AVAILABLE(code) 1
-#define WC2MB_FIRST(code, wc) regex_wc2mb_first(code, wc)
-
-#define mbmaxlen_dist(code) mbmaxlen(code)
-#define mbmaxlen(code) regex_mb_max_length(code)
-#define mblen(code,c) (code)[(int )(c)]
-
-#define IS_SINGLEBYTE_CODE(code) ((code) == REGCODE_ASCII)
-#define IS_INDEPENDENT_TRAIL(code) \
- ((code) == REGCODE_ASCII || (code) == REGCODE_UTF8)
-
-#define IS_CODE_ASCII(code,c) IS_ASCII(c)
-#define IS_CODE_GRAPH(code,c) IS_GRAPH(c)
-#define IS_CODE_PRINT(code,c) IS_PRINT(c)
-#define IS_CODE_ALNUM(code,c) IS_ALNUM(c)
-#define IS_CODE_ALPHA(code,c) IS_ALPHA(c)
-#define IS_CODE_LOWER(code,c) IS_LOWER(c)
-#define IS_CODE_UPPER(code,c) IS_UPPER(c)
-#define IS_CODE_CNTRL(code,c) IS_CNTRL(c)
-#define IS_CODE_PUNCT(code,c) IS_PUNCT(c)
-#define IS_CODE_SPACE(code,c) IS_SPACE(c)
-#define IS_CODE_BLANK(code,c) IS_BLANK(c)
-#define IS_CODE_DIGIT(code,c) IS_DIGIT(c)
-#define IS_CODE_ODIGIT(code,c) IS_ODIGIT(c)
-#define IS_CODE_XDIGIT(code,c) IS_XDIGIT(c)
-
-#define IS_SB_WORD(code,c) (IS_CODE_ALNUM(code,c) || (c) == '_')
-#define IS_MB_WORD(code,c) ismb(code,c)
-
-#define IS_CODE_WORD(code,c) \
- (IS_SB_WORD(code,c) && ((c) < 0x80 || (code) == REGCODE_ASCII))
-#define ISNOT_CODE_WORD(code,c) \
- ((!IS_SB_WORD(code,c)) && !ismb(code,c))
-
-#define IS_WORD_STR(code,s,end) \
- (ismb((code),*(s)) ? (s + mblen((code),*(s)) <= (end)) : \
- IS_SB_WORD(code,*(s)))
-#define IS_WORD_STR_INC(code,s,end) \
- (ismb((code),*(s)) ? ((s) += mblen((code),*(s)), (s) <= (end)) : \
- (s++, IS_SB_WORD(code,s[-1])))
-
-#define IS_WORD_HEAD(code,c) (ismb(code,c) ? 1 : IS_SB_WORD(code,c))
-
-extern int regex_mb_max_length P_((RegCharEncoding code));
-extern WCINT regex_mb2wc P_((UChar* p, UChar* end, RegCharEncoding code));
-extern int regex_wc2mb_first P_((RegCharEncoding code, WCINT wc));
-
-#endif /* not REG_RUBY_M17N */
-
#define ANCHOR_BEGIN_BUF (1<<0)
#define ANCHOR_BEGIN_LINE (1<<1)
OP_EXACTMB2N2, /* mb-length = 2 N = 2 */
OP_EXACTMB2N3, /* mb-length = 2 N = 3 */
OP_EXACTMB2N, /* mb-length = 2 */
- OP_EXACTMB3N, /* mb length = 3 */
+ OP_EXACTMB3N, /* mb-length = 3 */
OP_EXACTMBN, /* other length */
OP_EXACT1_IC, /* single byte, N = 1, ignore case */
OP_CCLASS_MB_NOT,
OP_CCLASS_MIX_NOT,
- OP_ANYCHAR, /* "." */
- OP_ANYCHAR_STAR, /* ".*" */
+ OP_ANYCHAR, /* "." */
+ OP_ANYCHAR_ML, /* "." multi-line */
+ OP_ANYCHAR_STAR, /* ".*" */
+ OP_ANYCHAR_ML_STAR, /* ".*" multi-line */
OP_ANYCHAR_STAR_PEEK_NEXT,
+ OP_ANYCHAR_ML_STAR_PEEK_NEXT,
OP_WORD,
OP_NOT_WORD,
OP_BACKREF2,
OP_BACKREF3,
OP_BACKREFN,
+ OP_BACKREFN_IC,
OP_BACKREF_MULTI,
+ OP_BACKREF_MULTI_IC,
OP_MEMORY_START,
OP_MEMORY_START_PUSH, /* push back-tracker to stack */
OP_REPEAT_INC_NG, /* non greedy */
OP_NULL_CHECK_START, /* null loop checker start */
OP_NULL_CHECK_END, /* null loop checker end */
+ OP_NULL_CHECK_END_MEMST, /* null loop checker end (with capture status) */
+ OP_NULL_CHECK_END_MEMST_PUSH, /* with capture status and push check-end */
OP_PUSH_POS, /* (?=...) start */
OP_POP_POS, /* (?=...) end */
#define SIZE_LENGTH sizeof(LengthType)
#define SIZE_MEMNUM sizeof(MemNumType)
#define SIZE_REPEATNUM sizeof(RepeatNumType)
-#define SIZE_OPTION sizeof(RegOptionType)
+#define SIZE_OPTION sizeof(OnigOptionType)
+#define SIZE_CODE_POINT sizeof(OnigCodePoint)
-#ifdef UNALIGNED_WORD_ACCESS
+#ifdef PLATFORM_UNALIGNED_WORD_ACCESS
#define GET_RELADDR_INC(addr,p) do{\
addr = *((RelAddrType* )(p));\
(p) += SIZE_RELADDR;\
} while(0)
#define GET_OPTION_INC(option,p) do{\
- option = *((RegOptionType* )(p));\
+ option = *((OnigOptionType* )(p));\
(p) += SIZE_OPTION;\
} while(0)
#else
#define SERIALIZE_BUFSIZE SIZEOF_INT
-#endif /* UNALIGNED_WORD_ACCESS */
+#endif /* PLATFORM_UNALIGNED_WORD_ACCESS */
+/* code point's address must be aligned address. */
+#define GET_CODE_POINT(code,p) code = *((OnigCodePoint* )(p))
#define GET_BYTE_INC(byte,p) do{\
byte = *(p);\
(p)++;\
#define SIZE_OP_RETURN SIZE_OPCODE
-#ifdef REG_DEBUG
+typedef struct {
+ OnigCodePoint esc;
+ OnigCodePoint anychar;
+ OnigCodePoint anytime;
+ OnigCodePoint zero_or_one_time;
+ OnigCodePoint one_or_more_time;
+ OnigCodePoint anychar_anytime;
+} OnigMetaCharTableType;
+
+extern OnigMetaCharTableType OnigMetaCharTable;
+
+#define MC_ESC OnigMetaCharTable.esc
+#define MC_ANYCHAR OnigMetaCharTable.anychar
+#define MC_ANYTIME OnigMetaCharTable.anytime
+#define MC_ZERO_OR_ONE_TIME OnigMetaCharTable.zero_or_one_time
+#define MC_ONE_OR_MORE_TIME OnigMetaCharTable.one_or_more_time
+#define MC_ANYCHAR_ANYTIME OnigMetaCharTable.anychar_anytime
+
+
+#ifdef ONIG_DEBUG
typedef struct {
short int opcode;
char* name;
short int arg_type;
-} RegOpInfoType;
+} OnigOpInfoType;
-extern RegOpInfoType RegOpInfo[];
+extern OnigOpInfoType OnigOpInfo[];
-extern void regex_print_compiled_byte_code P_((FILE* f, UChar* bp, UChar** nextp));
+extern void onig_print_compiled_byte_code P_((FILE* f, UChar* bp, UChar** nextp));
-#ifdef REG_DEBUG_STATISTICS
-extern void regex_statistics_init P_((void));
-extern void regex_print_statistics P_((FILE* f));
+#ifdef ONIG_DEBUG_STATISTICS
+extern void onig_statistics_init P_((void));
+extern void onig_print_statistics P_((FILE* f));
#endif
#endif
-extern char* regex_error_code_to_format P_((int code));
-extern void regex_snprintf_with_pattern PV_((char buf[], int bufsize, RegCharEncoding enc, char* pat, char* pat_end, char *fmt, ...));
-extern UChar* regex_strdup P_((UChar* s, UChar* end));
-extern int regex_bbuf_init P_((BBuf* buf, int size));
-extern int regex_alloc_init P_((regex_t** reg, RegOptionType option, RegCharEncoding code, RegSyntaxType* syntax));
-extern int regex_compile P_((regex_t* reg, UChar* pattern, UChar* pattern_end, RegErrorInfo* einfo));
-extern void regex_chain_reduce P_((regex_t* reg));
-extern int regex_is_in_wc_range P_((UChar* p, WCINT wc));
+extern char* onig_error_code_to_format P_((int code));
+extern void onig_snprintf_with_pattern PV_((char buf[], int bufsize, OnigEncoding enc, char* pat, char* pat_end, char *fmt, ...));
+extern UChar* onig_strdup P_((UChar* s, UChar* end));
+extern int onig_bbuf_init P_((BBuf* buf, int size));
+extern int onig_alloc_init P_((regex_t** reg, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax));
+extern int onig_compile P_((regex_t* reg, UChar* pattern, UChar* pattern_end, OnigErrorInfo* einfo));
+extern void onig_chain_reduce P_((regex_t* reg));
+extern int onig_is_in_code_range P_((UChar* p, OnigCodePoint code));
#endif /* REGINT_H */
regparse.c - Oniguruma (regular expression library)
- Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "regparse.h"
#define WARN_BUFSIZE 256
#define SYN_POSIX_COMMON_OP \
- ( REG_SYN_OP_ANYCHAR | REG_SYN_OP_POSIX_BRACKET | REG_SYN_OP_BACK_REF | \
- REG_SYN_OP_CC | REG_SYN_OP_0INF | REG_SYN_OP_LINE_ANCHOR | \
- REG_SYN_OP_ESC_CONTROL_CHAR )
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_POSIX_BRACKET | \
+ ONIG_SYN_OP_DECIMAL_BACKREF | \
+ ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_ASTERISK_ZERO_INF | \
+ ONIG_SYN_OP_LINE_ANCHOR | \
+ ONIG_SYN_OP_ESC_CONTROL_CHARS )
#define SYN_GNU_REGEX_OP \
- ( REG_SYN_OP_ANYCHAR | REG_SYN_OP_CC | \
- REG_SYN_OP_POSIX_BRACKET | REG_SYN_OP_BACK_REF | \
- REG_SYN_OP_INTERVAL | REG_SYN_OP_SUBEXP | REG_SYN_OP_ALT | \
- REG_SYN_OP_0INF | REG_SYN_OP_1INF | REG_SYN_OP_01 | \
- REG_SYN_OP_ESC_BUF_ANCHOR | REG_SYN_OP_ESC_WORD | \
- REG_SYN_OP_ESC_WORD_BOUND | REG_SYN_OP_ESC_WORD_BEGIN_END | \
- REG_SYN_OP_ESC_WHITE_SPACE | REG_SYN_OP_ESC_DIGIT | \
- REG_SYN_OP_LINE_ANCHOR )
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | \
+ ONIG_SYN_OP_POSIX_BRACKET | ONIG_SYN_OP_DECIMAL_BACKREF | \
+ ONIG_SYN_OP_BRACE_INTERVAL | ONIG_SYN_OP_LPAREN_SUBEXP | \
+ ONIG_SYN_OP_VBAR_ALT | \
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF | \
+ ONIG_SYN_OP_QMARK_ZERO_ONE | \
+ ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR | ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR | \
+ ONIG_SYN_OP_ESC_W_WORD | \
+ ONIG_SYN_OP_ESC_B_WORD_BOUND | ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | \
+ ONIG_SYN_OP_ESC_S_WHITE_SPACE | ONIG_SYN_OP_ESC_D_DIGIT | \
+ ONIG_SYN_OP_LINE_ANCHOR )
#define SYN_GNU_REGEX_BV \
- ( REG_SYN_CONTEXT_INDEP_ANCHORS | REG_SYN_CONTEXT_INDEP_OPS | \
- REG_SYN_CONTEXT_INVALID_OPS | REG_SYN_ALLOW_INVALID_INTERVAL | \
- REG_SYN_ESCAPE_IN_CC | REG_SYN_ALLOW_RANGE_OP_IN_CC )
+ ( ONIG_SYN_CONTEXT_INDEP_ANCHORS | ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | \
+ ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS | ONIG_SYN_ALLOW_INVALID_INTERVAL | \
+ ONIG_SYN_BACKSLASH_ESCAPE_IN_CC | ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )
#ifdef USE_VARIABLE_SYNTAX
-RegSyntaxType RegSyntaxPosixBasic = {
- ( SYN_POSIX_COMMON_OP | REG_SYN_OP_ESC_SUBEXP | REG_SYN_OP_ESC_INTERVAL )
+OnigSyntaxType OnigSyntaxPosixBasic = {
+ ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL )
, 0
, 0
- , ( REG_OPTION_SINGLELINE | REG_OPTION_MULTILINE )
+ , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )
};
-RegSyntaxType RegSyntaxPosixExtended = {
- ( SYN_POSIX_COMMON_OP | REG_SYN_OP_SUBEXP | REG_SYN_OP_INTERVAL |
- REG_SYN_OP_1INF | REG_SYN_OP_01 | REG_SYN_OP_ALT )
+OnigSyntaxType OnigSyntaxPosixExtended = {
+ ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_LPAREN_SUBEXP |
+ ONIG_SYN_OP_BRACE_INTERVAL |
+ ONIG_SYN_OP_PLUS_ONE_INF | ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_VBAR_ALT )
, 0
- , ( REG_SYN_CONTEXT_INDEP_ANCHORS |
- REG_SYN_CONTEXT_INDEP_OPS | REG_SYN_CONTEXT_INVALID_OPS |
- REG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP | REG_SYN_ALLOW_RANGE_OP_IN_CC )
- , ( REG_OPTION_SINGLELINE | REG_OPTION_MULTILINE )
+ , ( ONIG_SYN_CONTEXT_INDEP_ANCHORS |
+ ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS |
+ ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP |
+ ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )
+ , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )
};
-RegSyntaxType RegSyntaxEmacs = {
- ( REG_SYN_OP_ANYCHAR | REG_SYN_OP_CC | REG_SYN_OP_ESC_INTERVAL |
- REG_SYN_OP_ESC_SUBEXP | REG_SYN_OP_ESC_ALT |
- REG_SYN_OP_0INF | REG_SYN_OP_1INF | REG_SYN_OP_01 |
- REG_SYN_OP_BACK_REF | REG_SYN_OP_LINE_ANCHOR |
- REG_SYN_OP_ESC_GNU_BUF_ANCHOR | REG_SYN_OP_ESC_CONTROL_CHAR )
- , 0
- , REG_SYN_ALLOW_EMPTY_RANGE_IN_CC
- , REG_OPTION_NONE
+OnigSyntaxType OnigSyntaxEmacs = {
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC |
+ ONIG_SYN_OP_ESC_BRACE_INTERVAL |
+ ONIG_SYN_OP_ESC_LPAREN_SUBEXP | ONIG_SYN_OP_ESC_VBAR_ALT |
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF |
+ ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_DECIMAL_BACKREF |
+ ONIG_SYN_OP_LINE_ANCHOR | ONIG_SYN_OP_ESC_CONTROL_CHARS )
+ , ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR
+ , ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC
+ , ONIG_OPTION_NONE
};
-RegSyntaxType RegSyntaxGrep = {
- ( REG_SYN_OP_ANYCHAR | REG_SYN_OP_CC | REG_SYN_OP_POSIX_BRACKET |
- REG_SYN_OP_INTERVAL | REG_SYN_OP_ESC_SUBEXP | REG_SYN_OP_ESC_ALT |
- REG_SYN_OP_0INF | REG_SYN_OP_ESC_1INF | REG_SYN_OP_ESC_01 |
- REG_SYN_OP_LINE_ANCHOR )
+OnigSyntaxType OnigSyntaxGrep = {
+ ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_POSIX_BRACKET |
+ ONIG_SYN_OP_BRACE_INTERVAL | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |
+ ONIG_SYN_OP_ESC_VBAR_ALT |
+ ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_ESC_PLUS_ONE_INF |
+ ONIG_SYN_OP_ESC_QMARK_ZERO_ONE | ONIG_SYN_OP_LINE_ANCHOR |
+ ONIG_SYN_OP_ESC_W_WORD | ONIG_SYN_OP_ESC_B_WORD_BOUND |
+ ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | ONIG_SYN_OP_DECIMAL_BACKREF )
, 0
- , ( REG_SYN_ALLOW_EMPTY_RANGE_IN_CC | REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC )
- , REG_OPTION_NONE
+ , ( ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC | ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC )
+ , ONIG_OPTION_NONE
};
-RegSyntaxType RegSyntaxGnuRegex = {
+OnigSyntaxType OnigSyntaxGnuRegex = {
SYN_GNU_REGEX_OP
, 0
, SYN_GNU_REGEX_BV
- , REG_OPTION_NONE
+ , ONIG_OPTION_NONE
};
-RegSyntaxType RegSyntaxJava = {
- (( SYN_GNU_REGEX_OP | REG_SYN_OP_NON_GREEDY | REG_SYN_OP_SUBEXP_EFFECT |
- REG_SYN_OP_ESC_CONTROL_CHAR | REG_SYN_OP_ESC_C_CONTROL |
- REG_SYN_OP_QUOTE | REG_SYN_OP_ESC_OCTAL3 | REG_SYN_OP_ESC_X_HEX2 )
- & ~REG_SYN_OP_ESC_WORD_BEGIN_END )
- , ( REG_SYN_OP2_OPTION_PERL |
- REG_SYN_OP2_POSSESSIVE_REPEAT | REG_SYN_OP2_POSSESSIVE_INTERVAL |
- REG_SYN_OP2_CCLASS_SET | REG_SYN_OP2_ESC_V_VTAB |
- REG_SYN_OP2_ESC_U_HEX4 )
- , ( SYN_GNU_REGEX_BV | REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND )
- , REG_OPTION_SINGLELINE
+OnigSyntaxType OnigSyntaxJava = {
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |
+ ONIG_SYN_OP_ESC_CONTROL_CHARS | ONIG_SYN_OP_ESC_C_CONTROL |
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 )
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )
+ , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE | ONIG_SYN_OP2_QMARK_GROUP_EFFECT |
+ ONIG_SYN_OP2_OPTION_PERL | ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL | ONIG_SYN_OP2_CCLASS_SET_OP |
+ ONIG_SYN_OP2_ESC_V_VTAB | ONIG_SYN_OP2_ESC_U_HEX4 |
+ ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY )
+ , ( SYN_GNU_REGEX_BV | ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND )
+ , ONIG_OPTION_SINGLELINE
};
-RegSyntaxType RegSyntaxPerl = {
- (( SYN_GNU_REGEX_OP | REG_SYN_OP_NON_GREEDY | REG_SYN_OP_SUBEXP_EFFECT |
- REG_SYN_OP_ESC_OCTAL3 | REG_SYN_OP_ESC_X_HEX2 |
- REG_SYN_OP_ESC_X_BRACE_HEX8 | REG_SYN_OP_ESC_CONTROL_CHAR |
- REG_SYN_OP_ESC_C_CONTROL | REG_SYN_OP_QUOTE )
- & ~REG_SYN_OP_ESC_WORD_BEGIN_END )
- , REG_SYN_OP2_OPTION_PERL
+OnigSyntaxType OnigSyntaxPerl = {
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |
+ ONIG_SYN_OP_ESC_C_CONTROL )
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )
+ , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |
+ ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |
+ ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY )
, SYN_GNU_REGEX_BV
- , REG_OPTION_SINGLELINE
+ , ONIG_OPTION_SINGLELINE
};
#endif /* USE_VARIABLE_SYNTAX */
-RegSyntaxType RegSyntaxRuby = {
- (( SYN_GNU_REGEX_OP | REG_SYN_OP_NON_GREEDY | REG_SYN_OP_SUBEXP_EFFECT |
- REG_SYN_OP_ESC_OCTAL3 | REG_SYN_OP_ESC_X_HEX2 |
- REG_SYN_OP_ESC_X_BRACE_HEX8 | REG_SYN_OP_ESC_CONTROL_CHAR |
- REG_SYN_OP_ESC_C_CONTROL )
- & ~REG_SYN_OP_ESC_WORD_BEGIN_END )
- , ( REG_SYN_OP2_OPTION_RUBY |
- REG_SYN_OP2_NAMED_SUBEXP | REG_SYN_OP2_SUBEXP_CALL |
- REG_SYN_OP2_POSSESSIVE_REPEAT | REG_SYN_OP2_CCLASS_SET |
- REG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL |
- REG_SYN_OP2_ESC_M_BAR_META | REG_SYN_OP2_ESC_V_VTAB )
- , ( SYN_GNU_REGEX_BV | REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED |
- REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND )
- , REG_OPTION_NONE
+OnigSyntaxType OnigSyntaxRuby = {
+ (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |
+ ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |
+ ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |
+ ONIG_SYN_OP_ESC_C_CONTROL )
+ & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )
+ , ( ONIG_SYN_OP2_QMARK_GROUP_EFFECT |
+ ONIG_SYN_OP2_OPTION_RUBY |
+ ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP | ONIG_SYN_OP2_ESC_K_NAMED_BACKREF |
+ ONIG_SYN_OP2_ESC_G_SUBEXP_CALL |
+ ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |
+ ONIG_SYN_OP2_CCLASS_SET_OP | ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL |
+ ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META | ONIG_SYN_OP2_ESC_V_VTAB )
+ , ( SYN_GNU_REGEX_BV |
+ ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV |
+ ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND |
+ ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP |
+ ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME |
+ ONIG_SYN_WARN_CC_OP_NOT_ESCAPED |
+ ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT )
+ , ONIG_OPTION_NONE
};
-RegSyntaxType* RegDefaultSyntax = REG_SYNTAX_RUBY;
+OnigSyntaxType* OnigDefaultSyntax = ONIG_SYNTAX_RUBY;
#ifdef USE_VARIABLE_SYNTAX
extern int
-regex_set_default_syntax(RegSyntaxType* syntax)
+onig_set_default_syntax(OnigSyntaxType* syntax)
{
if (IS_NULL(syntax))
- syntax = REG_SYNTAX_RUBY;
+ syntax = ONIG_SYNTAX_RUBY;
+
+ OnigDefaultSyntax = syntax;
+ return 0;
+}
+
+extern void
+onig_copy_syntax(OnigSyntaxType* to, OnigSyntaxType* from)
+{
+ *to = *from;
+}
+
+extern void
+onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)
+{
+ syntax->op = op;
+}
+
+extern void
+onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)
+{
+ syntax->op2 = op2;
+}
- RegDefaultSyntax = syntax;
+extern void
+onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)
+{
+ syntax->behavior = behavior;
+}
+
+extern void
+onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)
+{
+ syntax->options = options;
+}
+#endif
+
+OnigMetaCharTableType OnigMetaCharTable = {
+ (OnigCodePoint )'\\' /* esc */
+ , (OnigCodePoint )0 /* anychar '.' */
+ , (OnigCodePoint )0 /* anytime '*' */
+ , (OnigCodePoint )0 /* zero or one time '?' */
+ , (OnigCodePoint )0 /* one or more time '+' */
+ , (OnigCodePoint )0 /* anychar anytime */
+};
+
+#ifdef USE_VARIABLE_META_CHARS
+extern int onig_set_meta_char(unsigned int what, unsigned int c)
+{
+ switch (what) {
+ case ONIG_META_CHAR_ESCAPE:
+ OnigMetaCharTable.esc = c;
+ break;
+ case ONIG_META_CHAR_ANYCHAR:
+ OnigMetaCharTable.anychar = c;
+ break;
+ case ONIG_META_CHAR_ANYTIME:
+ OnigMetaCharTable.anytime = c;
+ break;
+ case ONIG_META_CHAR_ZERO_OR_ONE_TIME:
+ OnigMetaCharTable.zero_or_one_time = c;
+ break;
+ case ONIG_META_CHAR_ONE_OR_MORE_TIME:
+ OnigMetaCharTable.one_or_more_time = c;
+ break;
+ case ONIG_META_CHAR_ANYCHAR_ANYTIME:
+ OnigMetaCharTable.anychar_anytime = c;
+ break;
+ default:
+ return ONIGERR_INVALID_ARGUMENT;
+ break;
+ }
return 0;
}
+#endif /* USE_VARIABLE_META_CHARS */
+
+
+extern void onig_null_warn(char* s) { }
+
+#ifdef DEFAULT_WARN_FUNCTION
+static OnigWarnFunc onig_warn = (OnigWarnFunc )DEFAULT_WARN_FUNCTION;
+#else
+static OnigWarnFunc onig_warn = onig_null_warn;
+#endif
+
+#ifdef DEFAULT_VERB_WARN_FUNCTION
+static OnigWarnFunc onig_verb_warn = (OnigWarnFunc )DEFAULT_VERB_WARN_FUNCTION;
+#else
+static OnigWarnFunc onig_verb_warn = onig_null_warn;
#endif
+extern void onig_set_warn_func(OnigWarnFunc f)
+{
+ onig_warn = f;
+}
+
+extern void onig_set_verb_warn_func(OnigWarnFunc f)
+{
+ onig_verb_warn = f;
+}
+
static void
bbuf_free(BBuf* bbuf)
{
BBuf *to;
*rto = to = (BBuf* )xmalloc(sizeof(BBuf));
- CHECK_NULL_RETURN_VAL(to, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(to, ONIGERR_MEMORY);
r = BBUF_INIT(to, from->alloc);
if (r != 0) return r;
to->used = from->used;
return 0;
}
-#define WC2MB_MAX_BUFLEN 7
#define ONOFF(v,f,negative) (negative) ? ((v) &= ~(f)) : ((v) |= (f))
#define SET_ALL_MULTI_BYTE_RANGE(pbuf) \
- add_wc_range_to_buf(pbuf, (WCINT )0x80, ~((WCINT )0),\
- (UChar )0x80, (UChar )0xff);
+ add_code_range_to_buf(pbuf, (OnigCodePoint )0x80, ~((OnigCodePoint )0))
#define ADD_ALL_MULTI_BYTE_RANGE(code, mbuf) do {\
- if (! IS_SINGLEBYTE_CODE(code)) {\
+ if (! ONIGENC_IS_SINGLEBYTE(code)) {\
r = SET_ALL_MULTI_BYTE_RANGE(&(mbuf));\
if (r) return r;\
}\
}
}
+#if 0
static void
bitset_set_all(BitSetRef bs)
{
bs[i] = ~((Bits )0);
}
}
+#endif
static void
bitset_invert(BitSetRef bs)
}
}
-static int
-k_strncmp(UChar* s1, UChar* s2, int n)
+extern int
+onig_strncmp(UChar* s1, UChar* s2, int n)
{
int x;
}
extern UChar*
-regex_strdup(UChar* s, UChar* end)
+onig_strdup(UChar* s, UChar* end)
{
int len = end - s;
#define PPEEK (p < end ? *p : PEND_VALUE)
#define PEND (p < end ? 0 : 1)
-#ifdef REG_RUBY_M17N
-
-static int
-wc2mb_buf(WCINT wc, UChar **bufs, UChar **bufe, RegCharEncoding enc)
-{
- int c, len;
-
- c = m17n_firstbyte(enc, wc);
- len = mblen(enc, c);
- if (len > (*bufe - *bufs)) {
- *bufs = xmalloc(len);
- CHECK_NULL_RETURN_VAL(*bufs, REGERR_MEMORY);
- }
- m17n_mbcput(enc, wc, *bufs);
- *bufe = *bufs + len;
- return 0;
-}
-
-#else /* REG_RUBY_M17N */
-
-extern int
-regex_wc2mb_first(RegCharEncoding code, WCINT wc)
-{
- if (code == REGCODE_ASCII) {
- return (wc & 0xff);
- }
- else if (code == REGCODE_UTF8) {
- if ((wc & 0xffffff80) == 0)
- return wc;
- else {
- if ((wc & 0xfffff800) == 0)
- return ((wc>>6)& 0x1f) | 0xc0;
- else if ((wc & 0xffff0000) == 0)
- return ((wc>>12) & 0x0f) | 0xe0;
- else if ((wc & 0xffe00000) == 0)
- return ((wc>>18) & 0x07) | 0xf0;
- else if ((wc & 0xfc000000) == 0)
- return ((wc>>24) & 0x03) | 0xf8;
- else if ((wc & 0x80000000) == 0)
- return ((wc>>30) & 0x01) | 0xfc;
- else {
- return REGERR_TOO_BIG_WIDE_CHAR_VALUE;
- }
- }
- }
- else {
- int first;
-
- if ((wc & 0xff0000) != 0) {
- first = (wc >> 16) & 0xff;
- if (mblen(code, first) != 3)
- return REGERR_INVALID_WIDE_CHAR_VALUE;
- }
- else if ((wc & 0xff00) != 0) {
- first = (wc >> 8) & 0xff;
- if (mblen(code, first) != 2)
- return REGERR_INVALID_WIDE_CHAR_VALUE;
- }
- else {
- if (mblen(code, wc) != 1)
- return REGERR_INVALID_WIDE_CHAR_VALUE;
- return wc;
- }
- return first;
- }
-}
-
-static int
-wc2mb(WCINT wc, UChar buf[], RegCharEncoding code)
-{
-#define UTF8_TRAILS(wc, shift) ((((wc) >> (shift)) & 0x3f) | 0x80)
-#define UTF8_TRAIL0(wc) (((wc) & 0x3f) | 0x80)
-
- UChar *p = buf;
-
- if (code == REGCODE_UTF8) {
- if ((wc & 0xffffff80) == 0)
- *p++ = wc;
- else {
- if ((wc & 0xfffff800) == 0) {
- *p++ = ((wc>>6)& 0x1f) | 0xc0;
- }
- else if ((wc & 0xffff0000) == 0) {
- *p++ = ((wc>>12) & 0x0f) | 0xe0;
- *p++ = UTF8_TRAILS(wc, 6);
- }
- else if ((wc & 0xffe00000) == 0) {
- *p++ = ((wc>>18) & 0x07) | 0xf0;
- *p++ = UTF8_TRAILS(wc, 12);
- *p++ = UTF8_TRAILS(wc, 6);
- }
- else if ((wc & 0xfc000000) == 0) {
- *p++ = ((wc>>24) & 0x03) | 0xf8;
- *p++ = UTF8_TRAILS(wc, 18);
- *p++ = UTF8_TRAILS(wc, 12);
- *p++ = UTF8_TRAILS(wc, 6);
- }
- else if ((wc & 0x80000000) == 0) {
- *p++ = ((wc>>30) & 0x01) | 0xfc;
- *p++ = UTF8_TRAILS(wc, 24);
- *p++ = UTF8_TRAILS(wc, 18);
- *p++ = UTF8_TRAILS(wc, 12);
- *p++ = UTF8_TRAILS(wc, 6);
- }
- else {
- return REGERR_TOO_BIG_WIDE_CHAR_VALUE;
- }
- *p++ = UTF8_TRAIL0(wc);
- }
- }
- else {
- if ((wc & 0xff0000) != 0) *p++ = ((wc >> 16) & 0xff);
- if ((wc & 0xff00) != 0) *p++ = ((wc >> 8) & 0xff);
- *p++ = (wc & 0xff);
-
- if (mblen(code, buf[0]) != (p - buf))
- return REGERR_INVALID_WIDE_CHAR_VALUE;
- }
-
- return p - buf;
-}
-
-static int
-wc2mb_buf(WCINT wc, UChar **bufs, UChar **bufe, RegCharEncoding code)
-{
- int r;
- r = wc2mb(wc, *bufs, code);
- if (r < 0) return r;
-
- *bufe = (*bufs) + r;
- return 0;
-}
-#endif /* not REG_RUBY_M17N */
-
-/* used as function pointer value */
-static int
-is_code_ascii(RegCharEncoding code, UChar c)
-{
- return (c < 128 ? 1 : 0);
-}
-
-static int
-is_code_graph(RegCharEncoding code, UChar c) { return IS_CODE_GRAPH(code, c); }
-static int
-is_code_print(RegCharEncoding code, UChar c) { return IS_CODE_PRINT(code, c); }
-static int
-is_code_alnum(RegCharEncoding code, UChar c) { return IS_CODE_ALNUM(code, c); }
-static int
-is_code_alpha(RegCharEncoding code, UChar c) { return IS_CODE_ALPHA(code, c); }
-static int
-is_code_lower(RegCharEncoding code, UChar c) { return IS_CODE_LOWER(code, c); }
-static int
-is_code_upper(RegCharEncoding code, UChar c) { return IS_CODE_UPPER(code, c); }
-static int
-is_code_cntrl(RegCharEncoding code, UChar c) { return IS_CODE_CNTRL(code, c); }
-static int
-is_code_punct(RegCharEncoding code, UChar c) { return IS_CODE_PUNCT(code, c); }
-static int
-is_code_space(RegCharEncoding code, UChar c) { return IS_CODE_SPACE(code, c); }
-static int
-is_code_blank(RegCharEncoding code, UChar c) { return IS_CODE_BLANK(code, c); }
-static int
-is_code_digit(RegCharEncoding code, UChar c) { return IS_CODE_DIGIT(code, c); }
-static int
-is_code_xdigit(RegCharEncoding code, UChar c) { return IS_CODE_XDIGIT(code, c); }
static UChar*
-k_strcat_capa(UChar* dest, UChar* dest_end, UChar* src, UChar* src_end, int capa)
+k_strcat_capa(UChar* dest, UChar* dest_end, UChar* src, UChar* src_end,
+ int capa)
{
UChar* r;
return r;
}
-#ifdef USE_NAMED_SUBEXP
+#ifdef USE_NAMED_GROUP
#define INIT_NAME_BACKREFS_ALLOC_NUM 8
#define NAMEBUF_SIZE 24
#define NAMEBUF_SIZE_1 25
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
static int
i_print_name_entry(UChar* key, NameEntry* e, void* arg)
{
}
extern int
-regex_print_names(FILE* fp, regex_t* reg)
+onig_print_names(FILE* fp, regex_t* reg)
{
NameTable* t = (NameTable* )reg->name_table;
}
extern int
-regex_names_free(regex_t* reg)
+onig_names_free(regex_t* reg)
{
int r;
NameTable* t;
key = namebuf;
}
else {
- key = regex_strdup(name, name_end);
+ key = onig_strdup(name, name_end);
if (IS_NULL(key)) return (NameEntry* )NULL;
}
}
}
typedef struct {
- int (*func)(UChar*,int,int*,void*);
+ int (*func)(UChar*,UChar*,int,int*,regex_t*,void*);
+ regex_t* reg;
void* arg;
int ret;
} INamesArg;
static int
i_names(UChar* key, NameEntry* e, INamesArg* arg)
{
- int r = (*(arg->func))(e->name, e->back_num,
- (e->back_num > 1 ? e->back_refs : &(e->back_ref1)), arg->arg);
+ int r = (*(arg->func))(e->name, e->name + strlen(e->name), e->back_num,
+ (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),
+ arg->reg, arg->arg);
if (r != 0) {
arg->ret = r;
return ST_STOP;
}
extern int
-regex_foreach_name(regex_t* reg, int (*func)(UChar*,int,int*,void*), void* arg)
+onig_foreach_name(regex_t* reg,
+ int (*func)(UChar*,UChar*,int,int*,regex_t*,void*),
+ void* arg)
{
INamesArg narg;
NameTable* t = (NameTable* )reg->name_table;
narg.ret = 0;
if (IS_NOT_NULL(t)) {
narg.func = func;
+ narg.reg = reg;
narg.arg = arg;
st_foreach(t, i_names, (HashDataType )&narg);
}
return narg.ret;
}
+extern int
+onig_number_of_names(regex_t* reg)
+{
+ NameTable* t = (NameTable* )reg->name_table;
+
+ if (IS_NOT_NULL(t))
+ return t->num_entries;
+ else
+ return 0;
+}
+
#else /* USE_ST_HASH_TABLE */
#define INIT_NAMES_ALLOC_NUM 8
} NameTable;
-#ifdef REG_DEBUG
+#ifdef ONIG_DEBUG
extern int
-regex_print_names(FILE* fp, regex_t* reg)
+onig_print_names(FILE* fp, regex_t* reg)
{
int i, j;
NameEntry* e;
e->back_refs = (int* )NULL;
}
}
+ if (IS_NOT_NULL(t->e)) {
+ xfree(t->e);
+ t->e = NULL;
+ }
t->num = 0;
}
return 0;
}
extern int
-regex_names_free(regex_t* reg)
+onig_names_free(regex_t* reg)
{
int r;
NameTable* t;
len = name_end - name;
for (i = 0; i < t->num; i++) {
e = &(t->e[i]);
- if (len == e->name_len && k_strncmp(name, e->name, len) == 0)
+ if (len == e->name_len && onig_strncmp(name, e->name, len) == 0)
return e;
}
}
}
extern int
-regex_foreach_name(regex_t* reg, int (*func)(UChar*,int,int*,void*), void* arg)
+onig_foreach_name(regex_t* reg,
+ int (*func)(UChar*,UChar*,int,int*,regex_t*,void*),
+ void* arg)
{
int i, r;
NameEntry* e;
if (IS_NOT_NULL(t)) {
for (i = 0; i < t->num; i++) {
e = &(t->e[i]);
- r = (*func)(e->name, e->back_num,
- (e->back_num > 1 ? e->back_refs : &(e->back_ref1)), arg);
+ r = (*func)(e->name, e->name + e->name_len, e->back_num,
+ (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),
+ reg, arg);
if (r != 0) return r;
}
}
return 0;
}
+extern int
+onig_number_of_names(regex_t* reg)
+{
+ NameTable* t = (NameTable* )reg->name_table;
+
+ if (IS_NOT_NULL(t))
+ return t->num;
+ else
+ return 0;
+}
+
#endif /* else USE_ST_HASH_TABLE */
static int
-name_add(regex_t* reg, UChar* name, UChar* name_end, int backref)
+name_add(regex_t* reg, UChar* name, UChar* name_end, int backref, ScanEnv* env)
{
int alloc;
NameEntry* e;
NameTable* t = (NameTable* )reg->name_table;
if (name_end - name <= 0)
- return REGERR_INVALID_SUBEXP_NAME;
+ return ONIGERR_EMPTY_GROUP_NAME;
e = name_find(reg, name, name_end);
if (IS_NULL(e)) {
reg->name_table = t = st_init_strtable();
}
e = (NameEntry* )xmalloc(sizeof(NameEntry));
- CHECK_NULL_RETURN_VAL(e, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(e, ONIGERR_MEMORY);
- e->name = regex_strdup(name, name_end);
- if (IS_NULL(e->name)) return REGERR_MEMORY;
+ e->name = onig_strdup(name, name_end);
+ if (IS_NULL(e->name)) return ONIGERR_MEMORY;
st_insert(t, (HashDataType )e->name, (HashDataType )e);
e->name_len = name_end - name;
if (IS_NULL(t)) {
alloc = INIT_NAMES_ALLOC_NUM;
t = (NameTable* )xmalloc(sizeof(NameTable));
- CHECK_NULL_RETURN_VAL(t, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(t, ONIGERR_MEMORY);
t->e = NULL;
t->alloc = 0;
t->num = 0;
t->e = (NameEntry* )xmalloc(sizeof(NameEntry) * alloc);
if (IS_NULL(t->e)) {
xfree(t);
- return REGERR_MEMORY;
+ return ONIGERR_MEMORY;
}
t->alloc = alloc;
reg->name_table = t;
alloc = t->alloc * 2;
t->e = (NameEntry* )xrealloc(t->e, sizeof(NameEntry) * alloc);
- CHECK_NULL_RETURN_VAL(t->e, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(t->e, ONIGERR_MEMORY);
t->alloc = alloc;
clear:
}
e = &(t->e[t->num]);
t->num++;
- e->name = regex_strdup(name, name_end);
+ e->name = onig_strdup(name, name_end);
e->name_len = name_end - name;
#endif
}
+ if (e->back_num >= 1 &&
+ ! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME)) {
+ onig_scan_env_set_error_string(env, ONIGERR_MULTIPLEX_DEFINED_NAME,
+ name, name_end);
+ return ONIGERR_MULTIPLEX_DEFINED_NAME;
+ }
+
e->back_num++;
if (e->back_num == 1) {
e->back_ref1 = backref;
}
- else if (e->back_num == 2) {
- alloc = INIT_NAME_BACKREFS_ALLOC_NUM;
- e->back_refs = (int* )xmalloc(sizeof(int) * alloc);
- CHECK_NULL_RETURN_VAL(e->back_refs, REGERR_MEMORY);
- e->back_alloc = alloc;
- e->back_refs[0] = e->back_ref1;
- e->back_refs[1] = backref;
- }
else {
- if (e->back_num > e->back_alloc) {
- alloc = e->back_alloc * 2;
- e->back_refs = (int* )xrealloc(e->back_refs, sizeof(int) * alloc);
- CHECK_NULL_RETURN_VAL(e->back_refs, REGERR_MEMORY);
+ if (e->back_num == 2) {
+ alloc = INIT_NAME_BACKREFS_ALLOC_NUM;
+ e->back_refs = (int* )xmalloc(sizeof(int) * alloc);
+ CHECK_NULL_RETURN_VAL(e->back_refs, ONIGERR_MEMORY);
e->back_alloc = alloc;
+ e->back_refs[0] = e->back_ref1;
+ e->back_refs[1] = backref;
+ }
+ else {
+ if (e->back_num > e->back_alloc) {
+ alloc = e->back_alloc * 2;
+ e->back_refs = (int* )xrealloc(e->back_refs, sizeof(int) * alloc);
+ CHECK_NULL_RETURN_VAL(e->back_refs, ONIGERR_MEMORY);
+ e->back_alloc = alloc;
+ }
+ e->back_refs[e->back_num - 1] = backref;
}
- e->back_refs[e->back_num - 1] = backref;
}
return 0;
}
extern int
-regex_name_to_group_numbers(regex_t* reg, UChar* name, UChar* name_end,
+onig_name_to_group_numbers(regex_t* reg, UChar* name, UChar* name_end,
int** nums)
{
NameEntry* e;
e = name_find(reg, name, name_end);
- if (IS_NULL(e)) return REGERR_UNDEFINED_NAME_REFERENCE;
+ if (IS_NULL(e)) return ONIGERR_UNDEFINED_NAME_REFERENCE;
switch (e->back_num) {
case 0:
return e->back_num;
}
-#else
+extern int
+onig_name_to_backref_number(regex_t* reg, UChar* name, UChar* name_end,
+ OnigRegion *region)
+{
+ int i, n, *nums;
+
+ n = onig_name_to_group_numbers(reg, name, name_end, &nums);
+ if (n < 0)
+ return n;
+ else if (n == 0)
+ return ONIGERR_PARSER_BUG;
+ else if (n == 1)
+ return nums[0];
+ else {
+ if (IS_NOT_NULL(region)) {
+ for (i = n - 1; i >= 0; i--) {
+ if (region->beg[nums[i]] != ONIG_REGION_NOTPOS)
+ return nums[i];
+ }
+ }
+ return nums[n - 1];
+ }
+}
+
+#else /* USE_NAMED_GROUP */
extern int
-regex_name_to_group_numbers(regex_t* reg, UChar* name, UChar* name_end,
+onig_name_to_group_numbers(regex_t* reg, UChar* name, UChar* name_end,
int** nums)
{
- return REG_NO_SUPPORT_CONFIG;
+ return ONIG_NO_SUPPORT_CONFIG;
}
extern int
-regex_foreach_name(regex_t* reg, int (*func)(UChar*,int,int*,void*), void* arg)
+onig_name_to_backref_number(regex_t* reg, UChar* name, UChar* name_end,
+ OnigRegion* region)
{
- return REG_NO_SUPPORT_CONFIG;
+ return ONIG_NO_SUPPORT_CONFIG;
+}
+
+extern int
+onig_foreach_name(regex_t* reg,
+ int (*func)(UChar*,UChar*,int,int*,regex_t*,void*),
+ void* arg)
+{
+ return ONIG_NO_SUPPORT_CONFIG;
}
-#endif
+
+extern int
+onig_number_of_names(regex_t* reg)
+{
+ return 0;
+}
+#endif /* else USE_NAMED_GROUP */
#define INIT_SCANENV_MEMNODES_ALLOC_SIZE 16
{
int i;
- BIT_STATUS_CLEAR(env->backtrack_mem);
+ BIT_STATUS_CLEAR(env->capture_history);
+ BIT_STATUS_CLEAR(env->bt_mem_start);
+ BIT_STATUS_CLEAR(env->bt_mem_end);
BIT_STATUS_CLEAR(env->backrefed_mem);
env->error = (UChar* )NULL;
env->error_end = (UChar* )NULL;
env->num_call = 0;
env->num_mem = 0;
+#ifdef USE_NAMED_GROUP
+ env->num_named = 0;
+#endif
env->mem_alloc = 0;
env->mem_nodes_dynamic = (Node** )NULL;
alloc = env->mem_alloc * 2;
p = (Node** )xrealloc(env->mem_nodes_dynamic, sizeof(Node*) * alloc);
}
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
for (i = env->num_mem + 1; i < alloc; i++)
p[i] = NULL_NODE;
if (env->num_mem >= num)
SCANENV_MEM_NODES(env)[num] = node;
else
- return REGERR_INVALID_BACKREF;
+ return ONIGERR_PARSER_BUG;
return 0;
}
#endif
extern void
-regex_node_free(Node* node)
+onig_node_free(Node* node)
{
if (IS_NULL(node)) return ;
case N_LIST:
case N_ALT:
- regex_node_free(NCONS(node).left);
- regex_node_free(NCONS(node).right);
+ onig_node_free(NCONS(node).left);
+ onig_node_free(NCONS(node).right);
break;
case N_CCLASS:
case N_QUALIFIER:
if (NQUALIFIER(node).target)
- regex_node_free(NQUALIFIER(node).target);
+ onig_node_free(NQUALIFIER(node).target);
break;
case N_EFFECT:
if (NEFFECT(node).target)
- regex_node_free(NEFFECT(node).target);
+ onig_node_free(NEFFECT(node).target);
break;
case N_BACKREF:
case N_ANCHOR:
if (NANCHOR(node).target)
- regex_node_free(NANCHOR(node).target);
+ onig_node_free(NANCHOR(node).target);
break;
}
#ifdef USE_RECYCLE_NODE
extern int
-regex_free_node_list()
+onig_free_node_list()
{
FreeNode* n;
}
extern Node*
-regex_node_new_anchor(int type)
+onig_node_new_anchor(int type)
{
Node* node = node_new();
CHECK_NULL_RETURN(node);
}
static Node*
-node_new_backref(int back_num, int* backrefs, ScanEnv* env)
+node_new_backref(int back_num, int* backrefs, int by_name, ScanEnv* env)
{
int i;
Node* node = node_new();
NBACKREF(node).state = 0;
NBACKREF(node).back_num = back_num;
NBACKREF(node).back_dynamic = (int* )NULL;
+ if (by_name != 0)
+ NBACKREF(node).state |= NST_NAME_REF;
for (i = 0; i < back_num; i++) {
if (backrefs[i] <= env->num_mem &&
else {
int* p = (int* )xmalloc(sizeof(int) * back_num);
if (IS_NULL(p)) {
- regex_node_free(node);
+ onig_node_free(node);
return NULL;
}
NBACKREF(node).back_dynamic = p;
NQUALIFIER(node).lower = lower;
NQUALIFIER(node).upper = upper;
NQUALIFIER(node).greedy = 1;
- NQUALIFIER(node).by_number = by_number;
- NQUALIFIER(node).target_may_empty = 0;
- NQUALIFIER(node).head_exact = NULL_NODE;
- NQUALIFIER(node).next_head_exact = NULL_NODE;
- NQUALIFIER(node).is_refered = 0;
+ NQUALIFIER(node).by_number = by_number;
+ NQUALIFIER(node).target_empty_info = NQ_TARGET_ISNOT_EMPTY;
+ NQUALIFIER(node).head_exact = NULL_NODE;
+ NQUALIFIER(node).next_head_exact = NULL_NODE;
+ NQUALIFIER(node).is_refered = 0;
return node;
}
}
extern Node*
-regex_node_new_effect(int type)
+onig_node_new_effect(int type)
{
return node_new_effect(type);
}
static Node*
-node_new_option(RegOptionType option)
+node_new_effect_memory(OnigOptionType option, int is_named)
+{
+ Node* node = node_new_effect(EFFECT_MEMORY);
+ CHECK_NULL_RETURN(node);
+ if (is_named != 0)
+ SET_EFFECT_STATUS(node, NST_NAMED_GROUP);
+
+#ifdef USE_SUBEXP_CALL
+ NEFFECT(node).option = option;
+#endif
+ return node;
+}
+
+static Node*
+node_new_option(OnigOptionType option)
{
Node* node = node_new_effect(EFFECT_OPTION);
CHECK_NULL_RETURN(node);
}
extern int
-regex_node_str_cat(Node* node, UChar* s, UChar* end)
+onig_node_str_cat(Node* node, UChar* s, UChar* end)
{
int addlen = end - s;
else
p = k_strcat_capa(NSTRING(node).s, NSTRING(node).end, s, end, capa);
- CHECK_NULL_RETURN_VAL(p, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(p, ONIGERR_MEMORY);
NSTRING(node).s = p;
NSTRING(node).capa = capa;
}
UChar s[1];
s[0] = c;
- return regex_node_str_cat(node, s, s + 1);
+ return onig_node_str_cat(node, s, s + 1);
}
extern void
-regex_node_conv_to_str_node(Node* node, int flag)
+onig_node_conv_to_str_node(Node* node, int flag)
{
node->type = N_STRING;
NSTRING(node).flag = 0;
NSTRING(node).s = NSTRING(node).buf;
NSTRING(node).end = NSTRING(node).buf;
- if (regex_node_str_cat(node, s, end)) {
- regex_node_free(node);
+ if (onig_node_str_cat(node, s, end)) {
+ onig_node_free(node);
return NULL;
}
return node;
}
static Node*
-str_node_split_last_char(StrNode* sn, RegCharEncoding enc)
+str_node_split_last_char(StrNode* sn, OnigEncoding enc)
{
UChar *p;
Node* n = NULL_NODE;
if (sn->end > sn->s) {
- p = regex_get_prev_char_head(enc, sn->s, sn->end);
+ p = onigenc_get_prev_char_head(enc, sn->s, sn->end);
if (p && p > sn->s) { /* can be splitted. */
n = node_new_str(p, sn->end);
if ((sn->flag & NSTR_RAW) != 0)
}
static int
-str_node_can_be_split(StrNode* sn, RegCharEncoding enc)
+str_node_can_be_split(StrNode* sn, OnigEncoding enc)
{
if (sn->end > sn->s) {
- return ((mblen(enc, *(sn->s)) < sn->end - sn->s) ? 1 : 0);
+ return ((enc_len(enc, *(sn->s)) < sn->end - sn->s) ? 1 : 0);
}
return 0;
}
extern int
-regex_scan_unsigned_number(UChar** src, UChar* end, RegCharEncoding enc)
+onig_scan_unsigned_number(UChar** src, UChar* end, OnigEncoding enc)
{
unsigned int num, val;
int c;
num = 0;
while (!PEND) {
PFETCH(c);
- if (IS_CODE_DIGIT(enc, c)) {
+ if (ONIGENC_IS_CODE_DIGIT(enc, c)) {
val = (unsigned int )DIGITVAL(c);
if ((INT_MAX_LIMIT - val) / 10UL < num)
return -1; /* overflow */
static int
scan_unsigned_hexadecimal_number(UChar** src, UChar* end, int maxlen,
- RegCharEncoding enc)
+ OnigEncoding enc)
{
int c;
unsigned int num, val;
num = 0;
while (!PEND && maxlen-- != 0) {
PFETCH(c);
- if (IS_CODE_XDIGIT(enc, c)) {
- val = (unsigned int )XDIGITVAL(c);
+ if (ONIGENC_IS_CODE_XDIGIT(enc, c)) {
+ val = (unsigned int )XDIGITVAL(enc,c);
if ((INT_MAX_LIMIT - val) / 16UL < num)
return -1; /* overflow */
- num = (num << 4) + XDIGITVAL(c);
+ num = (num << 4) + XDIGITVAL(enc,c);
}
else {
PUNFETCH;
static int
scan_unsigned_octal_number(UChar** src, UChar* end, int maxlen,
- RegCharEncoding enc)
+ OnigEncoding enc)
{
int c;
unsigned int num, val;
num = 0;
while (!PEND && maxlen-- != 0) {
PFETCH(c);
- if (IS_CODE_ODIGIT(enc, c)) {
+ if (ONIGENC_IS_CODE_DIGIT(enc, c) && c < '8') {
val = ODIGITVAL(c);
if ((INT_MAX_LIMIT - val) / 8UL < num)
return -1; /* overflow */
}
-#define BBUF_WRITE_WCINT(bbuf,pos,wc) \
- BBUF_WRITE(bbuf, pos, &(wc), SIZE_WCINT)
+#define BBUF_WRITE_CODE_POINT(bbuf,pos,code) \
+ BBUF_WRITE(bbuf, pos, &(code), SIZE_CODE_POINT)
/* data format:
- [multi-byte-head-BitSet][n][from-1][to-1][from-2][to-2] ... [from-n][to-n]
- (all data size is WCINT)
+ [n][from-1][to-1][from-2][to-2] ... [from-n][to-n]
+ (all data size is OnigCodePoint)
*/
static int
-new_wc_range(BBuf** pbuf)
+new_code_range(BBuf** pbuf)
{
-#define INIT_MULTI_BYTE_RANGE_SIZE (SIZE_WCINT * 5)
+#define INIT_MULTI_BYTE_RANGE_SIZE (SIZE_CODE_POINT * 5)
int r;
- WCINT n;
+ OnigCodePoint n;
BBuf* bbuf;
bbuf = *pbuf = (BBuf* )xmalloc(sizeof(BBuf));
- CHECK_NULL_RETURN_VAL(*pbuf, REGERR_MEMORY);
- r = BBUF_INIT(*pbuf, SIZE_BITSET + INIT_MULTI_BYTE_RANGE_SIZE);
+ CHECK_NULL_RETURN_VAL(*pbuf, ONIGERR_MEMORY);
+ r = BBUF_INIT(*pbuf, INIT_MULTI_BYTE_RANGE_SIZE);
if (r) return r;
n = 0;
- BBUF_WRITE_WCINT(bbuf, SIZE_BITSET, n);
- BITSET_CLEAR((BitSetRef )bbuf->p);
+ BBUF_WRITE_CODE_POINT(bbuf, 0, n);
return 0;
}
static int
-add_wc_range_to_buf(BBuf** pbuf, WCINT from, WCINT to, UChar cfrom, UChar cto)
+add_code_range_to_buf(BBuf** pbuf, OnigCodePoint from, OnigCodePoint to)
{
int r, inc_n, pos;
int low, high, bound, x;
- WCINT n, *data;
+ OnigCodePoint n, *data;
BBuf* bbuf;
if (from > to) {
}
if (IS_NULL(*pbuf)) {
- r = new_wc_range(pbuf);
+ r = new_code_range(pbuf);
if (r) return r;
bbuf = *pbuf;
n = 0;
}
else {
bbuf = *pbuf;
- GET_WCINT(n, bbuf->p + SIZE_BITSET);
+ GET_CODE_POINT(n, bbuf->p);
}
- data = (WCINT* )(bbuf->p + SIZE_BITSET);
+ data = (OnigCodePoint* )(bbuf->p);
data++;
for (low = 0, bound = n; low < bound; ) {
}
inc_n = low + 1 - high;
- if (n + inc_n > REG_MAX_MULTI_BYTE_RANGES_NUM)
- return REGERR_TOO_MANY_MULTI_BYTE_RANGES;
+ if (n + inc_n > ONIG_MAX_MULTI_BYTE_RANGES_NUM)
+ return ONIGERR_TOO_MANY_MULTI_BYTE_RANGES;
if (inc_n != 1) {
if (from > data[low*2])
}
if (inc_n != 0 && high < n) {
- int from_pos = SIZE_BITSET + SIZE_WCINT * (1 + high * 2);
- int to_pos = SIZE_BITSET + SIZE_WCINT * (1 + (low + 1) * 2);
- int size = (n - high) * 2 * SIZE_WCINT;
+ int from_pos = SIZE_CODE_POINT * (1 + high * 2);
+ int to_pos = SIZE_CODE_POINT * (1 + (low + 1) * 2);
+ int size = (n - high) * 2 * SIZE_CODE_POINT;
if (inc_n > 0) {
BBUF_MOVE_RIGHT(bbuf, from_pos, to_pos, size);
}
}
- pos = SIZE_BITSET + SIZE_WCINT * (1 + low * 2);
- BBUF_ENSURE_SIZE(bbuf, pos + SIZE_WCINT * 2);
- BBUF_WRITE_WCINT(bbuf, pos, from);
- BBUF_WRITE_WCINT(bbuf, pos + SIZE_WCINT, to);
+ pos = SIZE_CODE_POINT * (1 + low * 2);
+ BBUF_ENSURE_SIZE(bbuf, pos + SIZE_CODE_POINT * 2);
+ BBUF_WRITE_CODE_POINT(bbuf, pos, from);
+ BBUF_WRITE_CODE_POINT(bbuf, pos + SIZE_CODE_POINT, to);
n += inc_n;
- BBUF_WRITE_WCINT(bbuf, SIZE_BITSET, n);
+ BBUF_WRITE_CODE_POINT(bbuf, 0, n);
- if (inc_n > 0) {
- int i;
- UChar tmp;
-
- if (cfrom > cto) {
- tmp = cfrom; cfrom = cto; cto = tmp;
- }
-
- for (i = cfrom; i <= cto; i++) {
- BITSET_SET_BIT((BitSetRef)bbuf->p, i);
- }
- }
return 0;
}
static int
-add_wc_range(BBuf** pbuf, ScanEnv* env, WCINT from, WCINT to)
+add_code_range(BBuf** pbuf, ScanEnv* env, OnigCodePoint from, OnigCodePoint to)
{
- int cfrom, cto;
-
if (from > to) {
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_EMPTY_RANGE_IN_CC))
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))
return 0;
else
- return REGERR_EMPTY_RANGE_IN_CHAR_CLASS;
+ return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;
}
- cfrom = WC2MB_FIRST(env->enc, from);
- if (cfrom < 0) return cfrom;
- cto = WC2MB_FIRST(env->enc, to);
- if (cto < 0) return cto;
- return add_wc_range_to_buf(pbuf, from, to, (UChar )cfrom, (UChar )cto);
+ return add_code_range_to_buf(pbuf, from, to);
}
static int
-not_wc_range_buf(BBuf* bbuf, BBuf** pbuf)
+not_code_range_buf(BBuf* bbuf, BBuf** pbuf)
{
int r, i, n;
- WCINT pre, from, to, *data;
+ OnigCodePoint pre, from, to, *data;
*pbuf = (BBuf* )NULL;
if (IS_NULL(bbuf)) {
return SET_ALL_MULTI_BYTE_RANGE(pbuf);
}
- data = (WCINT* )(bbuf->p + SIZE_BITSET);
- GET_WCINT(n, data);
+ data = (OnigCodePoint* )(bbuf->p);
+ GET_CODE_POINT(n, data);
data++;
if (n <= 0) goto set_all;
from = data[i*2];
to = data[i*2+1];
if (pre <= from - 1) {
- r = add_wc_range_to_buf(pbuf, pre, from - 1, (UChar )0, (UChar )0);
+ r = add_code_range_to_buf(pbuf, pre, from - 1);
if (r != 0) return r;
}
- if (to == ~((WCINT )0)) break;
+ if (to == ~((OnigCodePoint )0)) break;
pre = to + 1;
}
- if (to < ~((WCINT )0)) {
- r = add_wc_range_to_buf(pbuf, to + 1, ~((WCINT )0), (UChar )0, (UChar )0);
+ if (to < ~((OnigCodePoint )0)) {
+ r = add_code_range_to_buf(pbuf, to + 1, ~((OnigCodePoint )0));
}
return r;
}
} while (0)
static int
-or_wc_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)
+or_code_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)
{
int i, r;
- WCINT n1, *data1;
- WCINT from, to;
+ OnigCodePoint n1, *data1;
+ OnigCodePoint from, to;
*pbuf = (BBuf* )NULL;
if (IS_NULL(bbuf1) && IS_NULL(bbuf2)) {
return bbuf_clone(pbuf, bbuf2);
}
else {
- return not_wc_range_buf(bbuf2, pbuf);
+ return not_code_range_buf(bbuf2, pbuf);
}
}
}
if (not1 != 0)
SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);
- data1 = (WCINT* )(bbuf1->p + SIZE_BITSET);
- GET_WCINT(n1, data1);
+ data1 = (OnigCodePoint* )(bbuf1->p);
+ GET_CODE_POINT(n1, data1);
data1++;
if (not2 == 0 && not1 == 0) { /* 1 OR 2 */
r = bbuf_clone(pbuf, bbuf2);
}
else if (not1 == 0) { /* 1 OR (not 2) */
- r = not_wc_range_buf(bbuf2, pbuf);
+ r = not_code_range_buf(bbuf2, pbuf);
}
if (r != 0) return r;
for (i = 0; i < n1; i++) {
from = data1[i*2];
to = data1[i*2+1];
- r = add_wc_range_to_buf(pbuf, from, to, (UChar )0, (UChar )0);
+ r = add_code_range_to_buf(pbuf, from, to);
if (r != 0) return r;
}
return 0;
}
static int
-and_wc_range1(BBuf** pbuf, WCINT from1, WCINT to1, WCINT* data, int n)
+and_code_range1(BBuf** pbuf, OnigCodePoint from1, OnigCodePoint to1,
+ OnigCodePoint* data, int n)
{
int i, r;
- WCINT from2, to2;
+ OnigCodePoint from2, to2;
for (i = 0; i < n; i++) {
from2 = data[i*2];
else if (from2 <= to1) {
if (to2 < to1) {
if (from1 <= from2 - 1) {
- r = add_wc_range_to_buf(pbuf, from1, from2-1, (UChar )0, (UChar )0);
+ r = add_code_range_to_buf(pbuf, from1, from2-1);
if (r != 0) return r;
}
from1 = to2 + 1;
if (from1 > to1) break;
}
if (from1 <= to1) {
- r = add_wc_range_to_buf(pbuf, from1, to1, (UChar )0, (UChar )0);
+ r = add_code_range_to_buf(pbuf, from1, to1);
if (r != 0) return r;
}
return 0;
}
static int
-and_wc_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)
+and_code_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)
{
int i, j, r;
- WCINT n1, n2, *data1, *data2;
- WCINT from, to, from1, to1, from2, to2;
+ OnigCodePoint n1, n2, *data1, *data2;
+ OnigCodePoint from, to, from1, to1, from2, to2;
*pbuf = (BBuf* )NULL;
if (IS_NULL(bbuf1)) {
if (not1 != 0)
SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);
- data1 = (WCINT* )(bbuf1->p + SIZE_BITSET);
- data2 = (WCINT* )(bbuf2->p + SIZE_BITSET);
- GET_WCINT(n1, data1);
- GET_WCINT(n2, data2);
+ data1 = (OnigCodePoint* )(bbuf1->p);
+ data2 = (OnigCodePoint* )(bbuf2->p);
+ GET_CODE_POINT(n1, data1);
+ GET_CODE_POINT(n2, data2);
data1++;
data2++;
if (to2 < from1) continue;
from = MAX(from1, from2);
to = MIN(to1, to2);
- r = add_wc_range_to_buf(pbuf, from, to, (UChar )0, (UChar )0);
+ r = add_code_range_to_buf(pbuf, from, to);
if (r != 0) return r;
}
}
for (i = 0; i < n1; i++) {
from1 = data1[i*2];
to1 = data1[i*2+1];
- r = and_wc_range1(pbuf, from1, to1, data2, n2);
+ r = and_code_range1(pbuf, from1, to1, data2, n2);
if (r != 0) return r;
}
}
}
static int
-and_cclass(CClassNode* dest, CClassNode* cc)
+and_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)
{
int r, not1, not2;
BBuf *buf1, *buf2, *pbuf;
bitset_invert(dest->bs);
}
- if (not1 != 0 && not2 != 0) {
- r = or_wc_range_buf(buf1, 0, buf2, 0, &pbuf);
- }
- else {
- r = and_wc_range_buf(buf1, not1, buf2, not2, &pbuf);
- if (r == 0 && not1 != 0) {
- BBuf *tbuf;
- r = not_wc_range_buf(pbuf, &tbuf);
- if (r != 0) {
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {
+ if (not1 != 0 && not2 != 0) {
+ r = or_code_range_buf(buf1, 0, buf2, 0, &pbuf);
+ }
+ else {
+ r = and_code_range_buf(buf1, not1, buf2, not2, &pbuf);
+ if (r == 0 && not1 != 0) {
+ BBuf *tbuf;
+ r = not_code_range_buf(pbuf, &tbuf);
+ if (r != 0) {
+ bbuf_free(pbuf);
+ return r;
+ }
bbuf_free(pbuf);
- return r;
+ pbuf = tbuf;
}
- bbuf_free(pbuf);
- pbuf = tbuf;
}
- }
- if (r != 0) return r;
+ if (r != 0) return r;
- dest->mbuf = pbuf;
- bbuf_free(buf1);
- if (IS_NOT_NULL(pbuf)) {
- bitset_set_all((BitSetRef )pbuf->p); /* Sorry, but I'm tired. */
+ dest->mbuf = pbuf;
+ bbuf_free(buf1);
+ return r;
}
- return r;
+ return 0;
}
static int
-or_cclass(CClassNode* dest, CClassNode* cc)
+or_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)
{
int r, not1, not2;
BBuf *buf1, *buf2, *pbuf;
bitset_invert(dest->bs);
}
- if (not1 != 0 && not2 != 0) {
- r = and_wc_range_buf(buf1, 0, buf2, 0, &pbuf);
- }
- else {
- r = or_wc_range_buf(buf1, not1, buf2, not2, &pbuf);
- if (r == 0 && not1 != 0) {
- BBuf *tbuf;
- r = not_wc_range_buf(pbuf, &tbuf);
- if (r != 0) {
+ if (! ONIGENC_IS_SINGLEBYTE(enc)) {
+ if (not1 != 0 && not2 != 0) {
+ r = and_code_range_buf(buf1, 0, buf2, 0, &pbuf);
+ }
+ else {
+ r = or_code_range_buf(buf1, not1, buf2, not2, &pbuf);
+ if (r == 0 && not1 != 0) {
+ BBuf *tbuf;
+ r = not_code_range_buf(pbuf, &tbuf);
+ if (r != 0) {
+ bbuf_free(pbuf);
+ return r;
+ }
bbuf_free(pbuf);
- return r;
+ pbuf = tbuf;
}
- bbuf_free(pbuf);
- pbuf = tbuf;
}
- }
- if (r != 0) return r;
+ if (r != 0) return r;
- dest->mbuf = pbuf;
- bbuf_free(buf1);
- if (IS_NOT_NULL(pbuf)) {
- bitset_set_all((BitSetRef )pbuf->p); /* Sorry, but I'm tired. */
+ dest->mbuf = pbuf;
+ bbuf_free(buf1);
+ return r;
}
- return r;
+ else
+ return 0;
}
static int
conv_backslash_value(int c, ScanEnv* env)
{
- if (IS_SYNTAX_OP(env->syntax, REG_SYN_OP_ESC_CONTROL_CHAR)) {
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_CONTROL_CHARS)) {
switch (c) {
case 'n': return '\n';
case 't': return '\t';
case 'b': return '\010';
case 'e': return '\033';
case 'v':
- if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_ESC_V_VTAB))
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_V_VTAB))
return '\v';
break;
return -1;
}
-static void
-reduce_nested_qualifier(Node* pnode, Node* cnode)
+extern void
+onig_reduce_nested_qualifier(Node* pnode, Node* cnode)
{
#define NQ_ASIS 0 /* as is */
#define NQ_DEL 1 /* delete parent */
}
c->target = NULL_NODE;
- regex_node_free(cnode);
+ onig_node_free(cnode);
}
TK_EOT = 0, /* end of token */
TK_BYTE = 1,
TK_RAW_BYTE = 2,
- TK_WC,
+ TK_CODE_POINT,
TK_ANYCHAR,
TK_CHAR_TYPE,
TK_BACKREF,
TK_ANCHOR,
TK_OP_REPEAT,
TK_INTERVAL,
+ TK_ANYCHAR_ANYTIME, /* SQL '%' == .* */
TK_ALT,
TK_SUBEXP_OPEN,
TK_SUBEXP_CLOSE,
TK_CC_OPEN,
TK_QUOTE_OPEN,
+ TK_CHAR_PROPERTY, /* \p{...}, \P{...} */
/* in cc */
TK_CC_CLOSE,
TK_CC_RANGE,
UChar* backp;
union {
int c;
- WCINT wc;
+ OnigCodePoint code;
int anchor;
int subtype;
struct {
int num;
int ref1;
int* refs;
+ int by_name;
} backref;
struct {
UChar* name;
UChar* name_end;
} call;
+ struct {
+ int not;
+ } prop;
} u;
-} RegToken;
+} OnigToken;
static int
-fetch_range_qualifier(UChar** src, UChar* end, RegToken* tok, ScanEnv* env)
+fetch_range_qualifier(UChar** src, UChar* end, OnigToken* tok, ScanEnv* env)
{
- int low, up, syn_allow;
+ int low, up, syn_allow, non_low = 0;
int c;
UChar* p = *src;
- syn_allow = IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_INVALID_INTERVAL);
+ syn_allow = IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INVALID_INTERVAL);
if (PEND) {
if (syn_allow)
return 1; /* "....{" : OK! */
else
- return REGERR_END_PATTERN_AT_LEFT_BRACE; /* "....{" syntax error */
+ return ONIGERR_END_PATTERN_AT_LEFT_BRACE; /* "....{" syntax error */
}
if (! syn_allow) {
c = PPEEK;
if (c == ')' || c == '(' || c == '|') {
- return REGERR_END_PATTERN_AT_LEFT_BRACE;
+ return ONIGERR_END_PATTERN_AT_LEFT_BRACE;
}
}
- low = regex_scan_unsigned_number(&p, end, env->enc);
- if (low < 0) return REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
- if (low > REG_MAX_REPEAT_NUM)
- return REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
+ low = onig_scan_unsigned_number(&p, end, env->enc);
+ if (low < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
+ if (low > ONIG_MAX_REPEAT_NUM)
+ return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
- if (p == *src) goto invalid; /* can't read low */
+ if (p == *src) { /* can't read low */
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV)) {
+ /* allow {,n} as {0,n} */
+ low = 0;
+ non_low = 1;
+ }
+ else
+ goto invalid;
+ }
if (PEND) goto invalid;
PFETCH(c);
if (c == ',') {
UChar* prev = p;
- up = regex_scan_unsigned_number(&p, end, env->enc);
- if (up < 0) return REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
- if (up > REG_MAX_REPEAT_NUM)
- return REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
-
- if (p == prev) up = REPEAT_INFINITE; /* {n,} : {n,infinite} */
+ up = onig_scan_unsigned_number(&p, end, env->enc);
+ if (up < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
+ if (up > ONIG_MAX_REPEAT_NUM)
+ return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;
+
+ if (p == prev) {
+ if (non_low != 0)
+ goto invalid;
+ up = REPEAT_INFINITE; /* {n,} : {n,infinite} */
+ }
}
else {
+ if (non_low != 0)
+ goto invalid;
+
PUNFETCH;
up = low; /* {n} : exact n times */
}
if (PEND) goto invalid;
PFETCH(c);
- if (IS_SYNTAX_OP(env->syntax, REG_SYN_OP_ESC_INTERVAL)) {
- if (c != '\\') goto invalid;
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) {
+ if (c != MC_ESC) goto invalid;
PFETCH(c);
}
if (c != '}') goto invalid;
if (!IS_REPEAT_INFINITE(up) && low > up) {
- return REGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE;
+ return ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE;
}
tok->type = TK_INTERVAL;
if (syn_allow)
return 1; /* OK */
else
- return REGERR_INVALID_REPEAT_RANGE_PATTERN;
+ return ONIGERR_INVALID_REPEAT_RANGE_PATTERN;
}
/* \M-, \C-, \c, or \... */
int c;
UChar* p = *src;
- if (PEND) return REGERR_END_PATTERN_AT_BACKSLASH;
+ if (PEND) return ONIGERR_END_PATTERN_AT_BACKSLASH;
PFETCH(c);
switch (c) {
case 'M':
- if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_ESC_M_BAR_META)) {
- if (PEND) return REGERR_END_PATTERN_AT_META;
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META)) {
+ if (PEND) return ONIGERR_END_PATTERN_AT_META;
PFETCH(c);
- if (c != '-') return REGERR_META_CODE_SYNTAX;
- if (PEND) return REGERR_END_PATTERN_AT_META;
+ if (c != '-') return ONIGERR_META_CODE_SYNTAX;
+ if (PEND) return ONIGERR_END_PATTERN_AT_META;
PFETCH(c);
- if (c == '\\') {
+ if (c == MC_ESC) {
c = fetch_escaped_value(&p, end, env);
if (c < 0) return c;
}
break;
case 'C':
- if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL)) {
- if (PEND) return REGERR_END_PATTERN_AT_CONTROL;
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL)) {
+ if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;
PFETCH(c);
- if (c != '-') return REGERR_CONTROL_CODE_SYNTAX;
+ if (c != '-') return ONIGERR_CONTROL_CODE_SYNTAX;
goto control;
}
else
goto backslash;
case 'c':
- if (IS_SYNTAX_OP(env->syntax, REG_SYN_OP_ESC_C_CONTROL)) {
+ if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_C_CONTROL)) {
control:
- if (PEND) return REGERR_END_PATTERN_AT_CONTROL;
+ if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;
PFETCH(c);
- if (c == '\\') {
+ if (c == MC_ESC) {
c = fetch_escaped_value(&p, end, env);
if (c < 0) return c;
}
return c;
}
-static int fetch_token(RegToken* tok, UChar** src, UChar* end, ScanEnv* env);
+static int fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env);
-#ifdef USE_NAMED_SUBEXP
+#ifdef USE_NAMED_GROUP
+/*
+ def: 0 -> define name (don't allow number name)
+ 1 -> reference name (allow number name)
+*/
static int
-fetch_name(UChar** src, UChar* end, UChar** name_end, ScanEnv* env)
+fetch_name(UChar** src, UChar* end, UChar** rname_end, ScanEnv* env, int ref)
{
- int len;
+ int r, len, is_num;
int c = 0;
+ UChar *name_end;
UChar *p = *src;
- while (!PEND) {
- *name_end = p;
+ name_end = end;
+ r = 0;
+ is_num = 0;
+ if (PEND) {
+ return ONIGERR_EMPTY_GROUP_NAME;
+ }
+ else {
PFETCH(c);
- if (c == '>') break;
- else if (c == ')' || c == '\\' || c == '\0')
- return REGERR_INVALID_SUBEXP_NAME;
+ if (c == '>')
+ return ONIGERR_EMPTY_GROUP_NAME;
- len = mblen(env->enc, c);
- while (!PEND && len-- > 1) {
+ if (ONIGENC_IS_CODE_DIGIT(env->enc, c)) {
+ if (ref == 1)
+ is_num = 1;
+ else {
+ r = ONIGERR_INVALID_GROUP_NAME;
+ }
+ }
+ len = enc_len(env->enc, c);
+ while (!PEND && len-- > 1)
PFETCH(c);
+ }
+
+ while (!PEND) {
+ name_end = p;
+ PFETCH(c);
+ if (c == '>' || c == ')') break;
+
+ len = enc_len(env->enc, c);
+ if (is_num == 1) {
+ if (! ONIGENC_IS_CODE_DIGIT(env->enc, c)) {
+ if (!ONIGENC_IS_CODE_ALPHA(env->enc, c) && c != '_')
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
+ else
+ r = ONIGERR_INVALID_GROUP_NAME;
+ }
+ }
+ else {
+ if (len == 1) {
+ if (!ONIGENC_IS_CODE_ALPHA(env->enc, c) &&
+ !ONIGENC_IS_CODE_DIGIT(env->enc, c) &&
+ c != '_') {
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
+ }
+ }
}
+
+ while (!PEND && len-- > 1)
+ PFETCH(c);
+ }
+ if (c != '>') {
+ r = ONIGERR_INVALID_GROUP_NAME;
+ name_end = end;
+ }
+ else {
+ c = **src;
+ if (ONIGENC_IS_CODE_UPPER(env->enc, c))
+ r = ONIGERR_INVALID_GROUP_NAME;
}
- if (c != '>') return REGERR_INVALID_SUBEXP_NAME;
- *src = p;
- return 0;
-}
-#endif
-static void
-CC_ESC_WARN(ScanEnv* env, UChar *c)
-{
-#ifdef WARNING
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED) &&
- IS_SYNTAX_BV(env->syntax, REG_SYN_ESCAPE_IN_CC)) {
- char buf[WARN_BUFSIZE];
- regex_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
- env->pattern, env->pattern_end,
- "character class has '%s' without escape", c);
- WARNING(buf);
+ if (r == 0) {
+ *rname_end = name_end;
+ *src = p;
+ return 0;
+ }
+ else {
+ onig_scan_env_set_error_string(env, r, *src, name_end);
+ return r;
}
-#endif
}
-
-static void
+#else
+static int
+fetch_name(UChar** src, UChar* end, UChar** rname_end, ScanEnv* env, int ref)
+{
+ int r, len;
+ int c = 0;
+ UChar *name_end;
+ UChar *p = *src;
+
+ r = 0;
+ while (!PEND) {
+ name_end = p;
+ PFETCH(c);
+ if (enc_len(env->enc, c) > 1)
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
+
+ if (c == '>' || c == ')') break;
+ if (! ONIGENC_IS_CODE_DIGIT(env->enc, c))
+ r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;
+ }
+ if (c != '>') {
+ r = ONIGERR_INVALID_GROUP_NAME;
+ name_end = end;
+ }
+
+ if (r == 0) {
+ *rname_end = name_end;
+ *src = p;
+ return 0;
+ }
+ else {
+ err:
+ onig_scan_env_set_error_string(env, r, *src, name_end);
+ return r;
+ }
+}
+#endif
+
+static void
+CC_ESC_WARN(ScanEnv* env, UChar *c)
+{
+ if (onig_warn == onig_null_warn) return ;
+
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED) &&
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC)) {
+ char buf[WARN_BUFSIZE];
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
+ env->pattern, env->pattern_end,
+ "character class has '%s' without escape", c);
+ (*onig_warn)(buf);
+ }
+}
+
+static void
CCEND_ESC_WARN(ScanEnv* env, UChar* c)
{
-#ifdef WARNING
- if (IS_SYNTAX_BV((env)->syntax, REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED)) {
+ if (onig_warn == onig_null_warn) return ;
+
+ if (IS_SYNTAX_BV((env)->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED)) {
char buf[WARN_BUFSIZE];
- regex_snprintf_with_pattern(buf, WARN_BUFSIZE, (env)->enc,
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, (env)->enc,
(env)->pattern, (env)->pattern_end,
"regular expression has '%s' without escape", c);
- WARNING(buf);
+ (*onig_warn)(buf);
}
-#endif
}
static UChar*
-find_str_position(WCINT s[], int n, UChar* from, UChar* to, UChar **next,
- RegCharEncoding enc)
+find_str_position(OnigCodePoint s[], int n, UChar* from, UChar* to,
+ UChar **next, OnigEncoding enc)
{
int i;
- WCINT x;
+ OnigCodePoint x;
UChar *q;
UChar *p = from;
while (p < to) {
- x = mb2wc(p, to, enc);
- q = p + mblen(enc, *p);
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);
+ q = p + enc_len(enc, *p);
if (x == s[0]) {
for (i = 1; i < n && q < to; i++) {
- x = mb2wc(q, to, enc);
+ x = ONIGENC_MBC_TO_CODE(enc, q, to);
if (x != s[i]) break;
- q += mblen(enc, *q);
+ q += enc_len(enc, *q);
}
if (i >= n) {
if (IS_NOT_NULL(next))
}
static int
-str_exist_check_with_esc(WCINT s[], int n, UChar* from, UChar* to,
- WCINT bad, RegCharEncoding enc)
+str_exist_check_with_esc(OnigCodePoint s[], int n, UChar* from, UChar* to,
+ OnigCodePoint bad, OnigEncoding enc)
{
int i, in_esc;
- WCINT x;
+ OnigCodePoint x;
UChar *q;
UChar *p = from;
while (p < to) {
if (in_esc) {
in_esc = 0;
- p += mblen(enc, *p);
+ p += enc_len(enc, *p);
}
else {
- x = mb2wc(p, to, enc);
- q = p + mblen(enc, *p);
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);
+ q = p + enc_len(enc, *p);
if (x == s[0]) {
for (i = 1; i < n && q < to; i++) {
- x = mb2wc(q, to, enc);
+ x = ONIGENC_MBC_TO_CODE(enc, q, to);
if (x != s[i]) break;
- q += mblen(enc, *q);
+ q += enc_len(enc, *q);
}
if (i >= n) return 1;
- p += mblen(enc, *p);
+ p += enc_len(enc, *p);
}
else {
- x = mb2wc(p, to, enc);
+ x = ONIGENC_MBC_TO_CODE(enc, p, to);
if (x == bad) return 0;
- else if (x == '\\') in_esc = 1;
+ else if (x == MC_ESC) in_esc = 1;
p = q;
}
}
}
static int
-fetch_token_in_cc(RegToken* tok, UChar** src, UChar* end, ScanEnv* env)
+fetch_token_in_cc(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)
{
int c, num;
- RegSyntaxType* syn = env->syntax;
+ OnigSyntaxType* syn = env->syntax;
UChar* prev;
UChar* p = *src;
else if (c == '-') {
tok->type = TK_CC_RANGE;
}
- else if (c == '\\') {
- if (! IS_SYNTAX_BV(syn, REG_SYN_ESCAPE_IN_CC))
+ else if (c == MC_ESC) {
+ if (! IS_SYNTAX_BV(syn, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC))
goto end;
- if (PEND) return REGERR_END_PATTERN_AT_BACKSLASH;
+ if (PEND) return ONIGERR_END_PATTERN_AT_BACKSLASH;
PFETCH(c);
tok->escaped = 1;
tok->u.subtype = CTYPE_NOT_WHITE_SPACE;
break;
+ case 'p':
+ case 'P':
+ if (PPEEK == '{' &&
+ IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY)) {
+ PINC;
+ tok->type = TK_CHAR_PROPERTY;
+ tok->u.prop.not = (c == 'P' ? 1 : 0);
+ }
+ break;
+
case 'x':
if (PEND) break;
prev = p;
- if (PPEEK == '{' && IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_X_BRACE_HEX8)) {
+ if (PPEEK == '{' && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {
PINC;
num = scan_unsigned_hexadecimal_number(&p, end, 8, env->enc);
- if (num < 0) return REGERR_TOO_BIG_WIDE_CHAR_VALUE;
- if (!PEND && IS_XDIGIT(*p) && p - prev >= 9)
- return REGERR_TOO_LONG_WIDE_CHAR_VALUE;
+ if (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;
+ if (!PEND && ONIGENC_IS_CODE_XDIGIT(env->enc, *p) && p - prev >= 9)
+ return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;
if (p > prev + 1 && !PEND && PPEEK == '}') {
PINC;
- tok->type = TK_WC;
- tok->base = 16;
- tok->u.wc = (WCINT )num;
+ tok->type = TK_CODE_POINT;
+ tok->base = 16;
+ tok->u.code = (OnigCodePoint )num;
}
else {
/* can't read nothing or invalid format */
p = prev;
}
}
- else if (IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_X_HEX2)) {
+ else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {
num = scan_unsigned_hexadecimal_number(&p, end, 2, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
if (PEND) break;
prev = p;
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_ESC_U_HEX4)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {
num = scan_unsigned_hexadecimal_number(&p, end, 4, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
case '0':
case '1': case '2': case '3': case '4': case '5': case '6': case '7':
- if (IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_OCTAL3)) {
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {
PUNFETCH;
prev = p;
num = scan_unsigned_octal_number(&p, end, 3, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
}
}
else if (c == '[') {
- if (IS_SYNTAX_OP(syn, REG_SYN_OP_POSIX_BRACKET) && PPEEK == ':') {
- WCINT send[] = { (WCINT )':', (WCINT )']' };
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_POSIX_BRACKET) && PPEEK == ':') {
+ OnigCodePoint send[] = { (OnigCodePoint )':', (OnigCodePoint )']' };
tok->backp = p; /* point at '[' is readed */
PINC;
- if (str_exist_check_with_esc(send, 2, p, end, (WCINT )']', env->enc)) {
+ if (str_exist_check_with_esc(send, 2, p, end, (OnigCodePoint )']',
+ env->enc)) {
tok->type = TK_POSIX_BRACKET_OPEN;
}
else {
}
else {
cc_in_cc:
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_CCLASS_SET)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP)) {
tok->type = TK_CC_CC_OPEN;
}
else {
}
}
else if (c == '&') {
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_CCLASS_SET) && !PEND && PPEEK == '&') {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP) &&
+ !PEND && PPEEK == '&') {
PINC;
tok->type = TK_CC_AND;
}
}
static int
-fetch_token(RegToken* tok, UChar** src, UChar* end, ScanEnv* env)
+fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)
{
int r, c, num;
- RegSyntaxType* syn = env->syntax;
+ OnigSyntaxType* syn = env->syntax;
UChar* prev;
UChar* p = *src;
tok->type = TK_BYTE;
tok->base = 0;
PFETCH(c);
- if (c == '\\') {
- if (PEND) return REGERR_END_PATTERN_AT_BACKSLASH;
+ if (c == MC_ESC) {
+ if (PEND) return ONIGERR_END_PATTERN_AT_BACKSLASH;
PFETCH(c);
tok->u.c = c;
tok->escaped = 1;
switch (c) {
case '*':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_0INF)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF)) break;
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 0;
tok->u.repeat.upper = REPEAT_INFINITE;
break;
case '+':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_1INF)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_PLUS_ONE_INF)) break;
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 1;
tok->u.repeat.upper = REPEAT_INFINITE;
break;
case '?':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_01)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_QMARK_ZERO_ONE)) break;
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 0;
tok->u.repeat.upper = 1;
greedy_check:
- if (!PEND && PPEEK == '?' && IS_SYNTAX_OP(syn, REG_SYN_OP_NON_GREEDY)) {
+ if (!PEND && PPEEK == '?' &&
+ IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_NON_GREEDY)) {
PFETCH(c);
tok->u.repeat.greedy = 0;
tok->u.repeat.possessive = 0;
}
else if (!PEND && PPEEK == '+' &&
- ((IS_SYNTAX_OP2(syn, REG_SYN_OP2_POSSESSIVE_REPEAT) &&
+ ((IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT) &&
tok->type != TK_INTERVAL) ||
- (IS_SYNTAX_OP2(syn, REG_SYN_OP2_POSSESSIVE_INTERVAL) &&
+ (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL) &&
tok->type == TK_INTERVAL))) {
PFETCH(c);
tok->u.repeat.greedy = 1;
break;
case '{':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_INTERVAL)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) break;
tok->backp = p;
r = fetch_range_qualifier(&p, end, tok, env);
if (r < 0) return r; /* error */
break;
case '|':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_ALT)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_VBAR_ALT)) break;
tok->type = TK_ALT;
break;
case '(':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_SUBEXP)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;
tok->type = TK_SUBEXP_OPEN;
break;
case ')':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_SUBEXP)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;
tok->type = TK_SUBEXP_CLOSE;
break;
case 'w':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_WORD;
break;
case 'W':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_NOT_WORD;
break;
case 'b':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD_BOUND)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;
tok->type = TK_ANCHOR;
tok->u.anchor = ANCHOR_WORD_BOUND;
break;
case 'B':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD_BOUND)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;
tok->type = TK_ANCHOR;
tok->u.anchor = ANCHOR_NOT_WORD_BOUND;
break;
#ifdef USE_WORD_BEGIN_END
case '<':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD_BEGIN_END)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;
tok->type = TK_ANCHOR;
tok->u.anchor = ANCHOR_WORD_BEGIN;
break;
case '>':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WORD_BEGIN_END)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;
tok->type = TK_ANCHOR;
tok->u.anchor = ANCHOR_WORD_END;
break;
#endif
case 's':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WHITE_SPACE)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_WHITE_SPACE;
break;
case 'S':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_WHITE_SPACE)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_NOT_WHITE_SPACE;
break;
case 'd':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_DIGIT)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_DIGIT;
break;
case 'D':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_DIGIT)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;
tok->type = TK_CHAR_TYPE;
tok->u.subtype = CTYPE_NOT_DIGIT;
break;
case 'A':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;
begin_buf:
tok->type = TK_ANCHOR;
tok->u.subtype = ANCHOR_BEGIN_BUF;
break;
case 'Z':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;
tok->type = TK_ANCHOR;
tok->u.subtype = ANCHOR_SEMI_END_BUF;
break;
case 'z':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;
end_buf:
tok->type = TK_ANCHOR;
tok->u.subtype = ANCHOR_END_BUF;
break;
case 'G':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR)) break;
tok->type = TK_ANCHOR;
tok->u.subtype = ANCHOR_BEGIN_POSITION;
break;
case '`':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_GNU_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;
goto begin_buf;
break;
case '\'':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_GNU_BUF_ANCHOR)) break;
+ if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;
goto end_buf;
break;
if (PEND) break;
prev = p;
- if (PPEEK == '{' && IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_X_BRACE_HEX8)) {
+ if (PPEEK == '{' && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {
PINC;
num = scan_unsigned_hexadecimal_number(&p, end, 8, env->enc);
- if (num < 0) return REGERR_TOO_BIG_WIDE_CHAR_VALUE;
- if (!PEND && IS_XDIGIT(*p) && p - prev >= 9)
- return REGERR_TOO_LONG_WIDE_CHAR_VALUE;
+ if (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;
+ if (!PEND && ONIGENC_IS_CODE_XDIGIT(env->enc, *p) && p - prev >= 9)
+ return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;
if (p > prev + 1 && !PEND && PPEEK == '}') {
PINC;
- tok->type = TK_WC;
- tok->u.wc = (WCINT )num;
+ tok->type = TK_CODE_POINT;
+ tok->u.code = (OnigCodePoint )num;
}
else {
/* can't read nothing or invalid format */
p = prev;
}
}
- else if (IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_X_HEX2)) {
+ else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {
num = scan_unsigned_hexadecimal_number(&p, end, 2, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
if (PEND) break;
prev = p;
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_ESC_U_HEX4)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {
num = scan_unsigned_hexadecimal_number(&p, end, 4, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
case '5': case '6': case '7': case '8': case '9':
PUNFETCH;
prev = p;
- num = regex_scan_unsigned_number(&p, end, env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
- if (num > REG_MAX_BACKREF_NUM) return REGERR_TOO_BIG_BACKREF_NUMBER;
+ num = onig_scan_unsigned_number(&p, end, env->enc);
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
+ if (num > ONIG_MAX_BACKREF_NUM) return ONIGERR_TOO_BIG_BACKREF_NUMBER;
- if (IS_SYNTAX_OP(syn, REG_SYN_OP_BACK_REF) &&
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_DECIMAL_BACKREF) &&
(num <= env->num_mem || num <= 9)) { /* This spec. from GNU regex */
- if (IS_SYNTAX_BV(syn, REG_SYN_STRICT_CHECK_BACKREF)) {
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {
if (num > env->num_mem || IS_NULL(SCANENV_MEM_NODES(env)[num]))
- return REGERR_INVALID_BACKREF;
+ return ONIGERR_INVALID_BACKREF;
}
tok->type = TK_BACKREF;
- tok->u.backref.num = 1;
- tok->u.backref.ref1 = num;
+ tok->u.backref.num = 1;
+ tok->u.backref.ref1 = num;
+ tok->u.backref.by_name = 0;
break;
}
else if (c == '8' || c == '9') {
p = prev;
/* fall through */
case '0':
- if (IS_SYNTAX_OP(syn, REG_SYN_OP_ESC_OCTAL3)) {
+ if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {
prev = p;
num = scan_unsigned_octal_number(&p, end, (c == '0' ? 2:3), env->enc);
- if (num < 0) return REGERR_TOO_BIG_NUMBER;
+ if (num < 0) return ONIGERR_TOO_BIG_NUMBER;
if (p == prev) { /* can't read nothing. */
num = 0; /* but, it's not error */
}
}
break;
-#ifdef USE_NAMED_SUBEXP
+#ifdef USE_NAMED_GROUP
case 'k':
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_NAMED_SUBEXP)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_K_NAMED_BACKREF)) {
PFETCH(c);
if (c == '<') {
UChar* name_end;
int* backs;
prev = p;
- r = fetch_name(&p, end, &name_end, env);
+ r = fetch_name(&p, end, &name_end, env, 1);
if (r < 0) return r;
- num = regex_name_to_group_numbers(env->reg, prev, name_end, &backs);
+ num = onig_name_to_group_numbers(env->reg, prev, name_end, &backs);
if (num <= 0) {
- regex_scan_env_set_error_string(env,
- REGERR_UNDEFINED_NAME_REFERENCE, prev, name_end);
- return REGERR_UNDEFINED_NAME_REFERENCE;
+ onig_scan_env_set_error_string(env,
+ ONIGERR_UNDEFINED_NAME_REFERENCE, prev, name_end);
+ return ONIGERR_UNDEFINED_NAME_REFERENCE;
}
- if (IS_SYNTAX_BV(syn, REG_SYN_STRICT_CHECK_BACKREF)) {
+ if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {
int i;
for (i = 0; i < num; i++) {
if (backs[i] > env->num_mem ||
IS_NULL(SCANENV_MEM_NODES(env)[backs[i]]))
- return REGERR_INVALID_BACKREF;
+ return ONIGERR_INVALID_BACKREF;
}
}
tok->type = TK_BACKREF;
+ tok->u.backref.by_name = 1;
if (num == 1) {
tok->u.backref.num = 1;
tok->u.backref.ref1 = backs[0];
#ifdef USE_SUBEXP_CALL
case 'g':
- if (IS_SYNTAX_OP2(syn, REG_SYN_OP2_SUBEXP_CALL)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_G_SUBEXP_CALL)) {
PFETCH(c);
if (c == '<') {
UChar* name_end;
prev = p;
- r = fetch_name(&p, end, &name_end, env);
+ r = fetch_name(&p, end, &name_end, env, 1);
if (r < 0) return r;
tok->type = TK_CALL;
#endif
case 'Q':
- if (IS_SYNTAX_OP(syn, REG_SYN_OP_QUOTE)) {
+ if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE)) {
tok->type = TK_QUOTE_OPEN;
}
break;
+ case 'p':
+ case 'P':
+ if (PPEEK == '{' &&
+ IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY)) {
+ PINC;
+ tok->type = TK_CHAR_PROPERTY;
+ tok->u.prop.not = (c == 'P' ? 1 : 0);
+ }
+ break;
+
default:
PUNFETCH;
num = fetch_escaped_value(&p, end, env);
tok->u.c = c;
tok->escaped = 0;
+#ifdef USE_VARIABLE_META_CHARS
+ if ((c != ONIG_INEFFECTIVE_META_CHAR) &&
+ IS_SYNTAX_OP(syn, ONIG_SYN_OP_VARIABLE_META_CHARACTERS)) {
+ if (c == MC_ANYCHAR)
+ goto any_char;
+ else if (c == MC_ANYTIME)
+ goto anytime;
+ else if (c == MC_ZERO_OR_ONE_TIME)
+ goto zero_or_one_time;
+ else if (c == MC_ONE_OR_MORE_TIME)
+ goto one_or_more_time;
+ else if (c == MC_ANYCHAR_ANYTIME) {
+ tok->type = TK_ANYCHAR_ANYTIME;
+ goto out;
+ }
+ }
+#endif
+
switch (c) {
case '.':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ANYCHAR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_DOT_ANYCHAR)) break;
+ any_char:
tok->type = TK_ANYCHAR;
break;
case '*':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_0INF)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ASTERISK_ZERO_INF)) break;
+ anytime:
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 0;
tok->u.repeat.upper = REPEAT_INFINITE;
break;
case '+':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_1INF)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_PLUS_ONE_INF)) break;
+ one_or_more_time:
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 1;
tok->u.repeat.upper = REPEAT_INFINITE;
break;
case '?':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_01)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_ZERO_ONE)) break;
+ zero_or_one_time:
tok->type = TK_OP_REPEAT;
tok->u.repeat.lower = 0;
tok->u.repeat.upper = 1;
break;
case '{':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_INTERVAL)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACE_INTERVAL)) break;
tok->backp = p;
r = fetch_range_qualifier(&p, end, tok, env);
if (r < 0) return r; /* error */
break;
case '|':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_ALT)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_VBAR_ALT)) break;
tok->type = TK_ALT;
break;
case '(':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_SUBEXP)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;
tok->type = TK_SUBEXP_OPEN;
break;
case ')':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_SUBEXP)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;
tok->type = TK_SUBEXP_CLOSE;
break;
case '^':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_LINE_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;
tok->type = TK_ANCHOR;
tok->u.subtype = (IS_SINGLELINE(env->option)
? ANCHOR_BEGIN_BUF : ANCHOR_BEGIN_LINE);
break;
case '$':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_LINE_ANCHOR)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;
tok->type = TK_ANCHOR;
tok->u.subtype = (IS_SINGLELINE(env->option)
? ANCHOR_END_BUF : ANCHOR_END_LINE);
break;
case '[':
- if (! IS_SYNTAX_OP(syn, REG_SYN_OP_CC)) break;
+ if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACKET_CC)) break;
tok->type = TK_CC_OPEN;
break;
if (IS_EXTEND(env->option)) {
while (!PEND) {
PFETCH(c);
- if (IS_NEWLINE(c))
+ if (ONIG_IS_NEWLINE(c))
break;
}
goto start;
}
}
+ out:
*src = p;
return tok->type;
}
-static void
-bitset_by_pred_func(BitSetRef bs, int (*pf)(RegCharEncoding, UChar),
- RegCharEncoding code, int not)
+static int
+add_ctype_to_cc_by_list(CClassNode* cc, int ctype, int not,
+ OnigEncoding enc)
{
- int c;
+ int i, j, r, nsb, nmb;
+ OnigCodePointRange *sbr, *mbr;
+
+ r = ONIGENC_GET_CTYPE_CODE_RANGE(enc, ctype, &nsb, &nmb, &sbr, &mbr);
+ if (r != 0) return r;
- if (not) {
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! pf(code, (UChar )c)) BITSET_SET_BIT(bs, c);
+ if (not == 0) {
+ for (i = 0; i < nsb; i++) {
+ for (j = sbr[i].from; j <= sbr[i].to; j++) {
+ BITSET_SET_BIT(cc->bs, j);
+ }
+ }
+ for (i = 0; i < nmb; i++) {
+ r = add_code_range_to_buf(&(cc->mbuf), mbr[i].from, mbr[i].to);
+ if (r != 0) return r;
}
}
else {
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (pf(code, (UChar )c)) BITSET_SET_BIT(bs, c);
+ OnigCodePoint prev = 0;
+ for (i = 0; i < nsb; i++) {
+ for (j = prev; j < sbr[i].from; j++) {
+ BITSET_SET_BIT(cc->bs, j);
+ }
+ prev = sbr[i].to + 1;
+ }
+ if (prev < 0x7f) {
+ for (j = prev; j < 0x7f; j++) {
+ BITSET_SET_BIT(cc->bs, j);
+ }
+ }
+
+ prev = 0x80;
+ for (i = 0; i < nmb; i++) {
+ if (prev < mbr[i].from) {
+ r = add_code_range_to_buf(&(cc->mbuf), prev, mbr[i].from - 1);
+ if (r != 0) return r;
+ }
+ prev = mbr[i].to + 1;
+ }
+ if (prev < 0x7fffffff) {
+ r = add_code_range_to_buf(&(cc->mbuf), prev, 0x7fffffff);
+ if (r != 0) return r;
+ }
+ }
+
+ return r;
+}
+
+static int
+add_ctype_to_cc(CClassNode* cc, int ctype, int not, ScanEnv* env)
+{
+ int c, r;
+ OnigEncoding enc = env->enc;
+
+ if (ONIGENC_CTYPE_SUPPORT_LEVEL(enc) != ONIGENC_CTYPE_SUPPORT_LEVEL_SB) {
+ r = add_ctype_to_cc_by_list(cc, ctype, not, env->enc);
+ return r;
+ }
+
+ r = 0;
+ switch (ctype) {
+ case ONIGENC_CTYPE_ALPHA:
+ case ONIGENC_CTYPE_BLANK:
+ case ONIGENC_CTYPE_CNTRL:
+ case ONIGENC_CTYPE_DIGIT:
+ case ONIGENC_CTYPE_LOWER:
+ case ONIGENC_CTYPE_PUNCT:
+ case ONIGENC_CTYPE_SPACE:
+ case ONIGENC_CTYPE_UPPER:
+ case ONIGENC_CTYPE_XDIGIT:
+ case ONIGENC_CTYPE_ASCII:
+ case ONIGENC_CTYPE_ALNUM:
+ if (not != 0) {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
+ BITSET_SET_BIT(cc->bs, c);
+ }
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);
+ }
+ else {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
+ BITSET_SET_BIT(cc->bs, c);
+ }
+ }
+ break;
+
+ case ONIGENC_CTYPE_GRAPH:
+ case ONIGENC_CTYPE_PRINT:
+ if (not != 0) {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
+ BITSET_SET_BIT(cc->bs, c);
+ }
}
+ else {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
+ BITSET_SET_BIT(cc->bs, c);
+ }
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);
+ }
+ break;
+
+ case ONIGENC_CTYPE_WORD:
+ if (not == 0) {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (ONIGENC_IS_CODE_SB_WORD(enc, c)) BITSET_SET_BIT(cc->bs, c);
+ }
+ ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);
+ }
+ else {
+ for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+ if (! ONIGENC_IS_CODE_SB_WORD(enc, c) && ! ONIGENC_IS_MBC_HEAD(enc, c))
+ BITSET_SET_BIT(cc->bs, c);
+ }
+ }
+ break;
+
+ default:
+ return ONIGERR_PARSER_BUG;
+ break;
}
+
+ return r;
+}
+
+static int
+parse_ctype_to_enc_ctype(int pctype, int* not)
+{
+ int ctype;
+
+ switch (pctype) {
+ case CTYPE_WORD:
+ ctype = ONIGENC_CTYPE_WORD;
+ *not = 0;
+ break;
+ case CTYPE_NOT_WORD:
+ ctype = ONIGENC_CTYPE_WORD;
+ *not = 1;
+ break;
+ case CTYPE_WHITE_SPACE:
+ ctype = ONIGENC_CTYPE_SPACE;
+ *not = 0;
+ break;
+ case CTYPE_NOT_WHITE_SPACE:
+ ctype = ONIGENC_CTYPE_SPACE;
+ *not = 1;
+ break;
+ case CTYPE_DIGIT:
+ ctype = ONIGENC_CTYPE_DIGIT;
+ *not = 0;
+ break;
+ case CTYPE_NOT_DIGIT:
+ ctype = ONIGENC_CTYPE_DIGIT;
+ *not = 1;
+ break;
+ default:
+ return ONIGERR_PARSER_BUG;
+ break;
+ }
+ return ctype;
}
typedef struct {
- UChar *name;
- int (*pf)(RegCharEncoding, UChar);
+ UChar *name;
+ int ctype;
short int len;
} PosixBracketEntryType;
#define POSIX_BRACKET_NAME_MAX_LEN 6
static PosixBracketEntryType PBS[] = {
- { "alnum", is_code_alnum, 5 },
- { "alpha", is_code_alpha, 5 },
- { "blank", is_code_blank, 5 },
- { "cntrl", is_code_cntrl, 5 },
- { "digit", is_code_digit, 5 },
- { "graph", is_code_graph, 5 },
- { "lower", is_code_lower, 5 },
- { "print", is_code_print, 5 },
- { "punct", is_code_punct, 5 },
- { "space", is_code_space, 5 },
- { "upper", is_code_upper, 5 },
- { "xdigit", is_code_xdigit, 6 },
- { "ascii", is_code_ascii, 5 }, /* I don't know origin. Perl? */
- { (UChar* )NULL, is_code_alnum, 0 }
+ { "alnum", ONIGENC_CTYPE_ALNUM, 5 },
+ { "alpha", ONIGENC_CTYPE_ALPHA, 5 },
+ { "blank", ONIGENC_CTYPE_BLANK, 5 },
+ { "cntrl", ONIGENC_CTYPE_CNTRL, 5 },
+ { "digit", ONIGENC_CTYPE_DIGIT, 5 },
+ { "graph", ONIGENC_CTYPE_GRAPH, 5 },
+ { "lower", ONIGENC_CTYPE_LOWER, 5 },
+ { "print", ONIGENC_CTYPE_PRINT, 5 },
+ { "punct", ONIGENC_CTYPE_PUNCT, 5 },
+ { "space", ONIGENC_CTYPE_SPACE, 5 },
+ { "upper", ONIGENC_CTYPE_UPPER, 5 },
+ { "xdigit", ONIGENC_CTYPE_XDIGIT, 6 },
+ { "ascii", ONIGENC_CTYPE_ASCII, 5 }, /* I don't know origin. Perl? */
+ { (UChar* )NULL, -1, 0 }
};
PosixBracketEntryType *pb;
- int not, i, c;
+ int not, i, c, r;
UChar *p = *src;
if (PPEEK == '^') {
goto not_posix_bracket;
for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {
- if (k_strncmp(p, pb->name, pb->len) == 0) {
+ if (onig_strncmp(p, pb->name, pb->len) == 0) {
p += pb->len;
if (end - p < 2 || *p != ':' || *(p+1) != ']')
- return REGERR_INVALID_POSIX_BRACKET_TYPE;
+ return ONIGERR_INVALID_POSIX_BRACKET_TYPE;
+
+ r = add_ctype_to_cc(cc, pb->ctype, not, env);
+ if (r != 0) return r;
- bitset_by_pred_func(cc->bs, pb->pf, env->enc, not);
PINC; PINC;
*src = p;
return 0;
if (!PEND) {
PFETCH(c);
if (c == ']')
- return REGERR_INVALID_POSIX_BRACKET_TYPE;
+ return ONIGERR_INVALID_POSIX_BRACKET_TYPE;
}
}
return 1; /* 1: is not POSIX bracket, but no error. */
}
+static int
+property_name_to_ctype(UChar* p, UChar* end)
+{
+ static PosixBracketEntryType PBS[] = {
+ { "Alnum", ONIGENC_CTYPE_ALNUM, 5 },
+ { "Alpha", ONIGENC_CTYPE_ALPHA, 5 },
+ { "Blank", ONIGENC_CTYPE_BLANK, 5 },
+ { "Cntrl", ONIGENC_CTYPE_CNTRL, 5 },
+ { "Digit", ONIGENC_CTYPE_DIGIT, 5 },
+ { "Graph", ONIGENC_CTYPE_GRAPH, 5 },
+ { "Lower", ONIGENC_CTYPE_LOWER, 5 },
+ { "Print", ONIGENC_CTYPE_PRINT, 5 },
+ { "Punct", ONIGENC_CTYPE_PUNCT, 5 },
+ { "Space", ONIGENC_CTYPE_SPACE, 5 },
+ { "Upper", ONIGENC_CTYPE_UPPER, 5 },
+ { "XDigit", ONIGENC_CTYPE_XDIGIT, 6 },
+ { "ASCII", ONIGENC_CTYPE_ASCII, 5 },
+ { (UChar* )NULL, -1, 0 }
+ };
+
+ PosixBracketEntryType *pb;
+ int len;
+
+ len = end - p;
+ for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {
+ if (len == pb->len && onig_strncmp(p, pb->name, pb->len) == 0)
+ return pb->ctype;
+ }
+
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;
+}
+
+static int
+fetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env)
+{
+ int ctype;
+ UChar *prev, *p = *src;
+ int c = 0;
+
+ while (!PEND) {
+ prev = p;
+ PFETCH(c);
+ if (c == '}') {
+ ctype = property_name_to_ctype(*src, prev);
+ if (ctype < 0) return ctype;
+
+ *src = p;
+ return ctype;
+ }
+ else if (c == '(' || c == ')' || c == '{' || c == '|')
+ break;
+ }
+
+ return ONIGERR_INVALID_CHAR_PROPERTY_NAME;
+}
+
+static int
+parse_char_property(Node** np, OnigToken* tok, UChar** src, UChar* end,
+ ScanEnv* env)
+{
+ int r, ctype;
+ CClassNode* cc;
+
+ ctype = fetch_char_property_to_ctype(src, end, env);
+ if (ctype < 0) return ctype;
+
+ *np = node_new_cclass();
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ cc = &(NCCLASS(*np));
+ r = add_ctype_to_cc(cc, ctype, 0, env);
+ if (r != 0) return r;
+ if (tok->u.prop.not != 0) CCLASS_SET_NOT(cc);
+
+ return 0;
+}
+
enum CCSTATE {
CCS_VALUE,
enum CCVALTYPE {
CCV_SB,
- CCV_WC,
+ CCV_CODE_POINT,
CCV_CLASS
};
static int
-next_state_class(CClassNode* cc, RegToken* tok, WCINT* vs,
- enum CCVALTYPE* type, enum CCSTATE* state, ScanEnv* env)
+next_state_class(CClassNode* cc, OnigCodePoint* vs, enum CCVALTYPE* type,
+ enum CCSTATE* state, ScanEnv* env)
{
- int r, c;
+ int r;
if (*state == CCS_RANGE)
- return REGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE;
+ return ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE;
if (*state == CCS_VALUE && *type != CCV_CLASS) {
if (*type == CCV_SB)
BITSET_SET_BIT(cc->bs, (int )(*vs));
- else if (*type == CCV_WC) {
- r = add_wc_range(&(cc->mbuf), env, *vs, *vs);
+ else if (*type == CCV_CODE_POINT) {
+ r = add_code_range(&(cc->mbuf), env, *vs, *vs);
if (r < 0) return r;
}
}
- if (tok->type == TK_CHAR_TYPE) {
- switch (tok->u.subtype) {
- case CTYPE_WORD:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_CODE_WORD(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- ADD_ALL_MULTI_BYTE_RANGE(env->enc, cc->mbuf);
- break;
- case CTYPE_NOT_WORD:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_CODE_WORD(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- break;
- case CTYPE_WHITE_SPACE:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_CODE_SPACE(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- break;
- case CTYPE_NOT_WHITE_SPACE:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_CODE_SPACE(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- ADD_ALL_MULTI_BYTE_RANGE(env->enc, cc->mbuf);
- break;
- case CTYPE_DIGIT:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_CODE_DIGIT(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- break;
- case CTYPE_NOT_DIGIT:
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_CODE_DIGIT(env->enc, c)) BITSET_SET_BIT(cc->bs, c);
- }
- ADD_ALL_MULTI_BYTE_RANGE(env->enc, cc->mbuf);
- break;
- default:
- return REGERR_PARSER_BUG;
- break;
- }
- }
- else { /* TK_POSIX_BRACKET_OPEN */
- /* nothing */
- }
-
*state = CCS_VALUE;
*type = CCV_CLASS;
return 0;
}
static int
-next_state_val(CClassNode* cc, WCINT *vs, WCINT v, int* vs_israw, int v_israw,
+next_state_val(CClassNode* cc, OnigCodePoint *vs, OnigCodePoint v,
+ int* vs_israw, int v_israw,
enum CCVALTYPE intype, enum CCVALTYPE* type,
enum CCSTATE* state, ScanEnv* env)
{
case CCS_VALUE:
if (*type == CCV_SB)
BITSET_SET_BIT(cc->bs, (int )(*vs));
- else if (*type == CCV_WC) {
- r = add_wc_range(&(cc->mbuf), env, *vs, *vs);
+ else if (*type == CCV_CODE_POINT) {
+ r = add_code_range(&(cc->mbuf), env, *vs, *vs);
if (r < 0) return r;
}
break;
case CCS_RANGE:
if (intype == *type) {
if (intype == CCV_SB) {
- if (IS_IGNORECASE(env->option) && (*vs_israw == 0 && v_israw == 0)) {
- int low, high;
-
- low = TOLOWER(env->enc, *vs);
- high = TOLOWER(env->enc, v);
- if (low > high) {
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_EMPTY_RANGE_IN_CC))
- goto ccs_range_end;
- else
- return REGERR_EMPTY_RANGE_IN_CHAR_CLASS;
- }
-
- if (low < 'A' && high >= 'a' && high <= 'z') {
- bitset_set_range(cc->bs, low, (int )'A' - 1);
- bitset_set_range(cc->bs, (int )'a', high);
- }
- else if (high > 'z' && low >= 'a' && low <= 'z') {
- bitset_set_range(cc->bs, low, (int )'z');
- bitset_set_range(cc->bs, (int )'z' + 1, high);
- }
- else {
- bitset_set_range(cc->bs, low, high);
- }
- }
- else {
- if (*vs > v) {
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_EMPTY_RANGE_IN_CC))
- goto ccs_range_end;
- else
- return REGERR_EMPTY_RANGE_IN_CHAR_CLASS;
- }
- bitset_set_range(cc->bs, (int )*vs, (int )v);
+ if (*vs > v) {
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))
+ goto ccs_range_end;
+ else
+ return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;
}
+ bitset_set_range(cc->bs, (int )*vs, (int )v);
}
else {
- r = add_wc_range(&(cc->mbuf), env, *vs, v);
+ r = add_code_range(&(cc->mbuf), env, *vs, v);
if (r < 0) return r;
}
}
else {
-#ifndef REG_RUBY_M17N
- if (env->enc == REGCODE_UTF8 && intype == CCV_WC && *type == CCV_SB) {
+ if (intype == CCV_CODE_POINT && *type == CCV_SB &&
+ ONIGENC_IS_CONTINUOUS_SB_MB(env->enc)) {
bitset_set_range(cc->bs, (int )*vs, 0x7f);
- r = add_wc_range(&(cc->mbuf), env, (WCINT )0x80, v);
+ r = add_code_range(&(cc->mbuf), env, (OnigCodePoint )0x80, v);
if (r < 0) return r;
}
else
-#endif
- return REGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE;
+ return ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE;
}
ccs_range_end:
*state = CCS_COMPLETE;
static int
char_exist_check(UChar c, UChar* from, UChar* to, int ignore_escaped,
- RegCharEncoding enc)
+ OnigEncoding enc)
{
int in_esc;
UChar* p = from;
}
else {
if (*p == c) return 1;
- if (*p == '\\') in_esc = 1;
+ if (*p == MC_ESC) in_esc = 1;
}
- p += mblen(enc, *p);
+ p += enc_len(enc, *p);
}
return 0;
}
static int
-parse_char_class(Node** np, RegToken* tok, UChar** src, UChar* end,
+parse_char_class(Node** np, OnigToken* tok, UChar** src, UChar* end,
ScanEnv* env)
{
int r, neg, len, fetched, and_start;
- WCINT v, vs;
+ OnigCodePoint v, vs;
UChar *p;
Node* node;
CClassNode *cc, *prev_cc;
enum CCVALTYPE val_type, in_type;
int val_israw, in_israw;
+ prev_cc = (CClassNode* )NULL;
*np = NULL_NODE;
r = fetch_token_in_cc(tok, src, end, env);
- if (r == TK_BYTE && tok->u.c == '^') {
+ if (r == TK_BYTE && tok->u.c == '^' && tok->escaped == 0) {
neg = 1;
r = fetch_token_in_cc(tok, src, end, env);
}
if (r < 0) return r;
if (r == TK_CC_CLOSE) {
if (! char_exist_check(']', *src, env->pattern_end, 1, env->enc))
- return REGERR_EMPTY_CHAR_CLASS;
+ return ONIGERR_EMPTY_CHAR_CLASS;
CC_ESC_WARN(env, "]");
r = tok->type = TK_BYTE; /* allow []...] */
}
*np = node = node_new_cclass();
- CHECK_NULL_RETURN_VAL(node, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(node, ONIGERR_MEMORY);
cc = &(NCCLASS(node));
- prev_cc = (CClassNode* )NULL;
and_start = 0;
state = CCS_START;
fetched = 0;
switch (r) {
case TK_BYTE:
- len = mblen(env->enc, tok->u.c);
+ len = enc_len(env->enc, tok->u.c);
if (len > 1) {
PUNFETCH;
- v = MB2WC(p, end, env->enc);
+ v = ONIGENC_MBC_TO_CODE(env->enc, p, end);
p += len;
+ in_type = CCV_CODE_POINT;
}
else {
sb_char:
- v = (WCINT )tok->u.c;
+ v = (OnigCodePoint )tok->u.c;
+ in_type = CCV_SB;
}
in_israw = 0;
- goto val_entry;
+ goto val_entry2;
break;
case TK_RAW_BYTE:
- len = mblen(env->enc, tok->u.c);
+ len = enc_len(env->enc, tok->u.c);
if (len > 1 && tok->base != 0) { /* tok->base != 0 : octal or hexadec. */
- UChar buf[WC2MB_MAX_BUFLEN];
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];
UChar* bufp = buf;
- UChar* bufe = buf + WC2MB_MAX_BUFLEN;
+ UChar* bufe = buf + ONIGENC_CODE_TO_MBC_MAXLEN;
int i, base = tok->base;
- if (len > WC2MB_MAX_BUFLEN) {
+ if (len > ONIGENC_CODE_TO_MBC_MAXLEN) {
bufp = (UChar* )xmalloc(len);
if (IS_NULL(bufp)) {
- r = REGERR_MEMORY;
+ r = ONIGERR_MEMORY;
goto err;
}
bufe = bufp + len;
bufp[i] = tok->u.c;
}
if (i < len) {
- r = REGERR_TOO_SHORT_MULTI_BYTE_STRING;
+ r = ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;
raw_byte_err:
if (bufp != buf) xfree(bufp);
goto err;
}
- v = MB2WC(bufp, bufe, env->enc);
- fetched = 1;
+ v = ONIGENC_MBC_TO_CODE(env->enc, bufp, bufe);
if (bufp != buf) xfree(bufp);
+ in_type = CCV_CODE_POINT;
}
else {
- v = (WCINT )tok->u.c;
+ v = (OnigCodePoint )tok->u.c;
+ in_type = CCV_SB;
}
in_israw = 1;
- goto val_entry;
+ goto val_entry2;
break;
- case TK_WC:
- v = tok->u.wc;
+ case TK_CODE_POINT:
+ v = tok->u.code;
in_israw = 1;
val_entry:
- in_type = (v < SINGLE_BYTE_SIZE ? CCV_SB : CCV_WC);
+ len = ONIGENC_CODE_TO_MBCLEN(env->enc, v);
+ if (len < 0) {
+ r = len;
+ goto err;
+ }
+ in_type = (len == 1 ? CCV_SB : CCV_CODE_POINT);
+ val_entry2:
r = next_state_val(cc, &vs, v, &val_israw, in_israw, in_type, &val_type,
&state, env);
if (r != 0) goto err;
if (r == 1) { /* is not POSIX bracket */
CC_ESC_WARN(env, "[");
p = tok->backp;
- v = (WCINT )tok->u.c;
+ v = (OnigCodePoint )tok->u.c;
in_israw = 0;
goto val_entry;
}
- /* POSIX bracket fall */
+ goto next_class;
+ break;
+
case TK_CHAR_TYPE:
- r = next_state_class(cc, tok, &vs, &val_type, &state, env);
+ {
+ int ctype, not;
+ ctype = parse_ctype_to_enc_ctype(tok->u.subtype, ¬);
+ r = add_ctype_to_cc(cc, ctype, not, env);
+ if (r != 0) return r;
+ }
+
+ next_class:
+ r = next_state_class(cc, &vs, &val_type, &state, env);
if (r != 0) goto err;
break;
+ case TK_CHAR_PROPERTY:
+ {
+ int ctype;
+
+ ctype = fetch_char_property_to_ctype(&p, end, env);
+ if (ctype < 0) return ctype;
+ r = add_ctype_to_cc(cc, ctype, tok->u.prop.not, env);
+ if (r != 0) return r;
+ goto next_class;
+ }
+ break;
+
case TK_CC_RANGE:
if (state == CCS_VALUE) {
r = fetch_token_in_cc(tok, &p, end, env);
fetched = 1;
if (r == TK_CC_CLOSE) { /* allow [x-] */
range_end_val:
- v = (WCINT )'-';
+ v = (OnigCodePoint )'-';
in_israw = 0;
goto val_entry;
}
}
else if (state == CCS_START) {
/* [-xa] is allowed */
- v = (WCINT )tok->u.c;
+ v = (OnigCodePoint )tok->u.c;
in_israw = 0;
r = fetch_token_in_cc(tok, &p, end, env);
goto range_end_val;
}
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_RANGE_OP_IN_CC)) {
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC)) {
CC_ESC_WARN(env, "-");
goto sb_char; /* [0-9-a] is allowed as [0-9\-a] */
}
- r = REGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS;
+ r = ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS;
goto err;
}
break;
r = parse_char_class(&anode, tok, &p, end, env);
if (r != 0) goto cc_open_err;
acc = &(NCCLASS(anode));
- r = or_cclass(cc, acc);
+ r = or_cclass(cc, acc, env->enc);
+ onig_node_free(anode);
cc_open_err:
- regex_node_free(anode);
if (r != 0) goto err;
}
break;
state = CCS_START;
if (IS_NOT_NULL(prev_cc)) {
- r = and_cclass(prev_cc, cc);
+ r = and_cclass(prev_cc, cc, env->enc);
if (r != 0) goto err;
+ bbuf_free(cc->mbuf);
}
else {
prev_cc = cc;
break;
case TK_EOT:
- r = REGERR_PREMATURE_END_OF_CHAR_CLASS;
+ r = ONIGERR_PREMATURE_END_OF_CHAR_CLASS;
goto err;
break;
default:
- r = REGERR_PARSER_BUG;
+ r = ONIGERR_PARSER_BUG;
goto err;
break;
}
}
if (IS_NOT_NULL(prev_cc)) {
- r = and_cclass(prev_cc, cc);
+ r = and_cclass(prev_cc, cc, env->enc);
if (r != 0) goto err;
+ bbuf_free(cc->mbuf);
cc = prev_cc;
}
cc->not = neg;
if (cc->not != 0 &&
- IS_SYNTAX_BV(env->syntax, REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC)) {
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC)) {
int is_empty;
is_empty = (IS_NULL(cc->mbuf) ? 1 : 0);
if (is_empty != 0)
BITSET_IS_EMPTY(cc->bs, is_empty);
if (is_empty == 0)
- BITSET_SET_BIT(cc->bs, NEWLINE);
+ BITSET_SET_BIT(cc->bs, ONIG_NEWLINE);
}
*src = p;
return 0;
err:
- regex_node_free(*np);
+ if (cc != &(NCCLASS(*np)))
+ bbuf_free(cc->mbuf);
+ onig_node_free(*np);
return r;
}
-static int parse_subexp(Node** top, RegToken* tok, int term,
+static int parse_subexp(Node** top, OnigToken* tok, int term,
UChar** src, UChar* end, ScanEnv* env);
static int
-parse_effect(Node** np, RegToken* tok, int term, UChar** src, UChar* end,
+parse_effect(Node** np, OnigToken* tok, int term, UChar** src, UChar* end,
ScanEnv* env)
{
Node *target;
- RegOptionType option;
+ OnigOptionType option;
int r, c, num;
+ int list_capture;
UChar* p = *src;
*np = NULL;
- if (PEND) return REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;
+ if (PEND) return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;
option = env->option;
- if (PPEEK == '?' && IS_SYNTAX_OP(env->syntax, REG_SYN_OP_SUBEXP_EFFECT)) {
+ if (PPEEK == '?' &&
+ IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_GROUP_EFFECT)) {
PINC;
- if (PEND) return REGERR_END_PATTERN_IN_GROUP;
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
PFETCH(c);
switch (c) {
case '#': /* (?#...) comment */
while (1) {
- if (PEND) return REGERR_END_PATTERN_IN_GROUP;
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
PFETCH(c);
if (c == ')') break;
}
return 3; /* 3: comment */
break;
- case ':': /* (?:...) grouping only */
- goto group;
+ case ':': /* (?:...) grouping only */
+ group:
+ r = fetch_token(tok, &p, end, env);
+ if (r < 0) return r;
+ r = parse_subexp(np, tok, term, &p, end, env);
+ if (r < 0) return r;
+ *src = p;
+ return 1; /* group */
break;
case '=':
- *np = regex_node_new_anchor(ANCHOR_PREC_READ);
+ *np = onig_node_new_anchor(ANCHOR_PREC_READ);
break;
case '!': /* preceding read */
- *np = regex_node_new_anchor(ANCHOR_PREC_READ_NOT);
+ *np = onig_node_new_anchor(ANCHOR_PREC_READ_NOT);
break;
case '>': /* (?>...) stop backtrack */
*np = node_new_effect(EFFECT_STOP_BACKTRACK);
case '<': /* look behind (?<=...), (?<!...) */
PFETCH(c);
if (c == '=')
- *np = regex_node_new_anchor(ANCHOR_LOOK_BEHIND);
+ *np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND);
else if (c == '!')
- *np = regex_node_new_anchor(ANCHOR_LOOK_BEHIND_NOT);
-#ifdef USE_NAMED_SUBEXP
- else if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_NAMED_SUBEXP)) {
+ *np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND_NOT);
+#ifdef USE_NAMED_GROUP
+ else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {
UChar *name;
UChar *name_end;
+
PUNFETCH;
+ list_capture = 0;
+
+ named_group:
name = p;
- r = fetch_name(&p, end, &name_end, env);
+ r = fetch_name(&p, end, &name_end, env, 0);
if (r < 0) return r;
- *np = node_new_effect(EFFECT_MEMORY);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
num = scan_env_add_mem_entry(env);
if (num < 0) return num;
- NEFFECT(*np).regnum = num;
- r = name_add(env->reg, name, name_end, num);
+ if (list_capture != 0 && num >= BIT_STATUS_BITS_NUM)
+ return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;
+
+ r = name_add(env->reg, name, name_end, num, env);
if (r != 0) return r;
+ *np = node_new_effect_memory(env->option, 1);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ NEFFECT(*np).regnum = num;
+ if (list_capture != 0)
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);
+ env->num_named++;
}
#endif
else
- return REGERR_UNDEFINED_GROUP_OPTION;
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
+ break;
+
+ case '@':
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)) {
+#ifdef USE_NAMED_GROUP
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {
+ PFETCH(c);
+ if (c == '<') {
+ list_capture = 1;
+ goto named_group; /* (?@<name>...) */
+ }
+ PUNFETCH;
+ }
+#endif
+ *np = node_new_effect_memory(env->option, 0);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ num = scan_env_add_mem_entry(env);
+ if (num < 0) {
+ onig_node_free(*np);
+ return num;
+ }
+ else if (num >= BIT_STATUS_BITS_NUM) {
+ onig_node_free(*np);
+ return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;
+ }
+ NEFFECT(*np).regnum = num;
+ BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);
+ }
+ else {
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
+ }
break;
#ifdef USE_POSIXLINE_OPTION
break;
case '-': neg = 1; break;
- case 'x': ONOFF(option, REG_OPTION_EXTEND, neg); break;
- case 'i': ONOFF(option, REG_OPTION_IGNORECASE, neg); break;
+ case 'x': ONOFF(option, ONIG_OPTION_EXTEND, neg); break;
+ case 'i': ONOFF(option, ONIG_OPTION_IGNORECASE, neg); break;
case 's':
- if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_OPTION_PERL)) {
- ONOFF(option, REG_OPTION_MULTILINE, neg);
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {
+ ONOFF(option, ONIG_OPTION_MULTILINE, neg);
}
else
- return REGERR_UNDEFINED_GROUP_OPTION;
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
break;
case 'm':
- if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_OPTION_PERL)) {
- ONOFF(option, REG_OPTION_SINGLELINE, (neg == 0 ? 1 : 0));
+ if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {
+ ONOFF(option, ONIG_OPTION_SINGLELINE, (neg == 0 ? 1 : 0));
}
- else if (IS_SYNTAX_OP2(env->syntax, REG_SYN_OP2_OPTION_RUBY)) {
- ONOFF(option, REG_OPTION_MULTILINE, neg);
+ else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) {
+ ONOFF(option, ONIG_OPTION_MULTILINE, neg);
}
else
- return REGERR_UNDEFINED_GROUP_OPTION;
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
break;
#ifdef USE_POSIXLINE_OPTION
case 'p':
- ONOFF(option, REG_OPTION_MULTILINE|REG_OPTION_SINGLELINE, neg);
+ ONOFF(option, ONIG_OPTION_MULTILINE|ONIG_OPTION_SINGLELINE, neg);
break;
#endif
default:
- return REGERR_UNDEFINED_GROUP_OPTION;
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
}
- if (c == ')') { /* option only */
- if (option == env->option) {
- *np = node_new_empty();
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- *src = p;
- return 0;
- }
- else {
- *np = node_new_option(option);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- *src = p;
- return 2; /* option only */
- }
+ if (c == ')') {
+ *np = node_new_option(option);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ *src = p;
+ return 2; /* option only */
}
else if (c == ':') {
- if (env->option == option) {
- group:
- r = fetch_token(tok, &p, end, env);
- if (r < 0) return r;
- r = parse_subexp(np, tok, term, &p, end, env);
- if (r < 0) return r;
- *src = p;
- return 1; /* group */
- }
- else {
- RegOptionType prev = env->option;
-
- env->option = option;
- r = fetch_token(tok, &p, end, env);
- if (r < 0) return r;
- r = parse_subexp(&target, tok, term, &p, end, env);
- env->option = prev;
- if (r < 0) return r;
- *np = node_new_option(option);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- NEFFECT(*np).target = target;
- *src = p;
- return 0;
- }
+ OnigOptionType prev = env->option;
+
+ env->option = option;
+ r = fetch_token(tok, &p, end, env);
+ if (r < 0) return r;
+ r = parse_subexp(&target, tok, term, &p, end, env);
+ env->option = prev;
+ if (r < 0) return r;
+ *np = node_new_option(option);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ NEFFECT(*np).target = target;
+ *src = p;
+ return 0;
}
- if (PEND) return REGERR_END_PATTERN_IN_GROUP;
+ if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
PFETCH(c);
}
}
break;
default:
- return REGERR_UNDEFINED_GROUP_OPTION;
+ return ONIGERR_UNDEFINED_GROUP_OPTION;
}
}
else {
-#ifdef USE_NAMED_SUBEXP
- if (IS_REG_OPTION_ON(env->option, REG_OPTION_CAPTURE_ONLY_NAMED_GROUP)) {
+#ifdef USE_NAMED_GROUP
+ if (ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_DONT_CAPTURE_GROUP))
goto group;
- }
#endif
- *np = node_new_effect(EFFECT_MEMORY);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+ *np = node_new_effect_memory(env->option, 0);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
num = scan_env_add_mem_entry(env);
if (num < 0) return num;
NEFFECT(*np).regnum = num;
}
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
r = fetch_token(tok, &p, end, env);
if (r < 0) return r;
r = parse_subexp(&target, tok, term, &p, end, env);
if (NTYPE(*np) == N_ANCHOR)
NANCHOR(*np).target = target;
- else
+ else {
NEFFECT(*np).target = target;
+ if (NEFFECT(*np).type == EFFECT_MEMORY) {
+ /* Don't move this to previous of parse_subexp() */
+ r = scan_env_set_mem_node(env, NEFFECT(*np).regnum, *np);
+ if (r != 0) return r;
+ }
+ }
*src = p;
return 0;
QualifierNode* qnt = &(NQUALIFIER(target));
#ifdef USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
- if (qn->by_number == 0 && qnt->by_number == 0) {
+ if (qn->by_number == 0 && qnt->by_number == 0 &&
+ IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT)) {
if (IS_REPEAT_INFINITE(qn->upper)) {
if (qn->lower == 0) { /* '*' */
redundant:
{
char buf[WARN_BUFSIZE];
- regex_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
- env->pattern, env->pattern_end,
- "redundant nested repeat operator");
- VERB_WARNING(buf);
+ if (onig_verb_warn != onig_null_warn) {
+ onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,
+ env->pattern, env->pattern_end,
+ "redundant nested repeat operator");
+ (*onig_verb_warn)(buf);
+ }
goto warn_exit;
}
}
}
}
}
-#endif
-#ifdef USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
warn_exit:
#endif
if (popular_qualifier_num(qnt) >= 0 && popular_qualifier_num(qn) >= 0) {
- reduce_nested_qualifier(qnode, target);
+ onig_reduce_nested_qualifier(qnode, target);
goto q_exit;
}
}
return 0;
}
+#ifdef USE_FOLD_MATCH
+static int
+make_alt_node_from_fold_info(OnigEncFoldMatchInfo* info, Node** node)
+{
+ int i;
+ UChar *s, *end;
+ Node *root, **ptail, *snode;
+
+ ptail = &root;
+ for (i = 0; i < info->target_num; i++) {
+ s = info->target_str[i];
+ end = s + info->target_byte_len[i];
+ /* ex.
+ U+00DF match "ss" and "SS, but not match "Ss".
+ So, string nodes must be raw.
+ */
+ snode = node_new_str_raw(s, end);
+ CHECK_NULL_RETURN_VAL(snode, ONIGERR_MEMORY);
+
+ *ptail = node_new_alt(snode, NULL_NODE);
+ CHECK_NULL_RETURN_VAL(*ptail, ONIGERR_MEMORY);
+ ptail = &(NCONS(*ptail).right);
+ }
+ *ptail = NULL_NODE;
+ *node = root;
+ return 0;
+}
+
+static int
+make_fold_alt_node_from_cc(OnigEncoding enc, CClassNode* cc, Node** root)
+{
+ int i, j, flen, len, ncode, n;
+ UChar *s, *end, buf[ONIGENC_CODE_TO_MBC_MAXLEN];
+ OnigCodePoint* codes;
+ Node **ptail, *snode;
+ OnigEncFoldMatchInfo* info;
+
+ *root = NULL_NODE;
+ ptail = root;
+
+ ncode = ONIGENC_GET_ALL_FOLD_MATCH_CODE(enc, &codes);
+ n = 0;
+ for (i = 0; i < ncode; i++) {
+ if (onig_is_code_in_cc(enc, codes[i], cc)) {
+ len = ONIGENC_CODE_TO_MBC(enc, codes[i], buf);
+ flen = ONIGENC_GET_FOLD_MATCH_INFO(enc, buf, buf + len, &info);
+ if (flen > 0) { /* fold */
+ for (j = 0; j < info->target_num; j++) {
+ s = info->target_str[j];
+ end = s + info->target_byte_len[j];
+ if (onig_strncmp(s, buf, enc_len(enc, *s)) == 0)
+ continue; /* ignore single char. */
+
+ snode = node_new_str_raw(s, end);
+ CHECK_NULL_RETURN_VAL(snode, ONIGERR_MEMORY);
+
+ *ptail = node_new_alt(snode, NULL_NODE);
+ CHECK_NULL_RETURN_VAL(*ptail, ONIGERR_MEMORY);
+ ptail = &(NCONS(*ptail).right);
+ n++;
+ }
+ }
+ }
+ }
+
+ return n;
+}
+#endif
+
static int
-parse_exp(Node** np, RegToken* tok, int term,
+parse_exp(Node** np, OnigToken* tok, int term,
UChar** src, UChar* end, ScanEnv* env)
{
- int r, len, c, group = 0;
+ int r, len, group = 0;
Node* qn;
+ Node** targetp;
start:
*np = NULL;
if (r == 1) group = 1;
else if (r == 2) { /* option only */
Node* target;
+ OnigOptionType prev = env->option;
+
+ env->option = NEFFECT(*np).option;
r = fetch_token(tok, src, end, env);
if (r < 0) return r;
r = parse_subexp(&target, tok, term, src, end, env);
+ env->option = prev;
if (r < 0) return r;
NEFFECT(*np).target = target;
return tok->type;
if (r < 0) return r;
goto start;
}
- else {
- if (NTYPE(*np) == N_EFFECT && NEFFECT(*np).type == EFFECT_MEMORY) {
- r = scan_env_set_mem_node(env, NEFFECT(*np).regnum, *np);
- if (r != 0) return r;
- }
- }
break;
case TK_SUBEXP_CLOSE:
- if (! IS_SYNTAX_BV(env->syntax, REG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP))
- return REGERR_UNMATCHED_CLOSE_PARENTHESIS;
+ if (! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP))
+ return ONIGERR_UNMATCHED_CLOSE_PARENTHESIS;
if (tok->escaped) goto tk_raw_byte;
else goto tk_byte;
case TK_BYTE:
tk_byte:
- *np = node_new_str_char((UChar )tok->u.c);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- len = mblen(env->enc, tok->u.c);
- if (len > 1) {
- regex_node_str_cat(*np, *src, *src + len - 1);
- *src += (len - 1);
- }
- while (1) {
- r = fetch_token(tok, src, end, env);
- if (r < 0) return r;
- if (r != TK_BYTE) goto repeat;
+ {
+ *np = node_new_str_char((UChar )tok->u.c);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
- r = node_str_cat_char(*np, (UChar )tok->u.c);
- if (r < 0) return r;
- len = mblen(env->enc, tok->u.c);
- if (len > 1) {
- regex_node_str_cat(*np, *src, *src + len - 1);
- *src += (len - 1);
+ while (1) {
+ len = enc_len(env->enc, tok->u.c);
+ if (len > 1) {
+ r = onig_node_str_cat(*np, *src, *src + len - 1);
+ if (r < 0) return r;
+ *src += (len - 1);
+ }
+
+ r = fetch_token(tok, src, end, env);
+ if (r < 0) return r;
+ if (r != TK_BYTE) break;
+
+ r = node_str_cat_char(*np, (UChar )tok->u.c);
+ if (r < 0) return r;
}
+
+ fold_entry:
+#ifdef USE_FOLD_MATCH
+ if (IS_IGNORECASE(env->option) && ONIGENC_IS_FOLD_MATCH(env->enc)) {
+ int flen, ret;
+ Node *root, **ptail, *work, *snode, *anode;
+ UChar *p, *pprev;
+ OnigEncFoldMatchInfo* fold_info;
+ StrNode* sn = &(NSTRING(*np));
+
+ ptail = &root;
+ pprev = sn->s;
+ for (p = sn->s; p < sn->end; ) {
+ flen = ONIGENC_GET_FOLD_MATCH_INFO(env->enc, p, sn->end, &fold_info);
+ if (flen > 0) { /* fold */
+ ret = make_alt_node_from_fold_info(fold_info, &anode);
+ if (ret != 0) return ret;
+ work = node_new_list(anode, NULL);
+ CHECK_NULL_RETURN_VAL(work, ONIGERR_MEMORY);
+
+ if (pprev < p) {
+ snode = node_new_str(pprev, p);
+ CHECK_NULL_RETURN_VAL(snode, ONIGERR_MEMORY);
+ *ptail = node_new_list(snode, work);
+ CHECK_NULL_RETURN_VAL(*ptail, ONIGERR_MEMORY);
+ }
+ else {
+ *ptail = work;
+ }
+ ptail = &(NCONS(work).right);
+ p += flen;
+ pprev = p;
+ }
+ else
+ p += enc_len(env->enc, *p);
+ }
+ *ptail = NULL_NODE;
+ if (IS_NOT_NULL(root)) {
+ if (pprev < sn->end) {
+ snode = node_new_str(pprev, sn->end);
+ CHECK_NULL_RETURN_VAL(snode, ONIGERR_MEMORY);
+ *ptail = node_new_list(snode, NULL_NODE);
+ CHECK_NULL_RETURN_VAL(*ptail, ONIGERR_MEMORY);
+ }
+ onig_node_free(*np);
+ *np = root;
+ }
+ }
+#endif
+ targetp = np;
+ goto repeat;
}
break;
case TK_RAW_BYTE:
tk_raw_byte:
- *np = node_new_str_raw_char((UChar )tok->u.c);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- while (1) {
- r = fetch_token(tok, src, end, env);
- if (r < 0) return r;
- if (r != TK_RAW_BYTE) goto repeat;
+ {
+ int expect_len;
- r = node_str_cat_char(*np, (UChar )tok->u.c);
- if (r < 0) return r;
+ *np = node_new_str_raw_char((UChar )tok->u.c);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ expect_len = enc_len(env->enc, tok->u.c);
+ len = 1;
+ while (1) {
+ r = fetch_token(tok, src, end, env);
+ if (r < 0) return r;
+ if (r != TK_RAW_BYTE) {
+#ifndef NUMBERED_CHAR_IS_NOT_CASE_AMBIG
+ if (len >= expect_len) {
+ NSTRING_CLEAR_RAW(*np);
+ }
+#endif
+ goto fold_entry;
+ }
+
+ r = node_str_cat_char(*np, (UChar )tok->u.c);
+ if (r < 0) return r;
+ len++;
+ }
}
break;
- case TK_WC:
+ case TK_CODE_POINT:
{
- UChar buf[WC2MB_MAX_BUFLEN];
- UChar* bufs = buf;
- UChar* bufe = bufs + WC2MB_MAX_BUFLEN;
- int num = wc2mb_buf(tok->u.wc, &bufs, &bufe, env->enc);
+ UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];
+ int num = ONIGENC_CODE_TO_MBC(env->enc, tok->u.code, buf);
if (num < 0) return num;
- *np = node_new_str_raw(bufs, bufe);
- if (bufs != buf) xfree(bufs);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+#ifdef NUMBERED_CHAR_IS_NOT_CASE_AMBIG
+ *np = node_new_str_raw(buf, buf + num);
+#else
+ *np = node_new_str(buf, buf + num);
+#endif
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
}
break;
case TK_QUOTE_OPEN:
{
- WCINT end_op[] = { (WCINT )'\\', (WCINT )'E' };
+ OnigCodePoint end_op[] = { (OnigCodePoint )MC_ESC, (OnigCodePoint )'E' };
UChar *qstart, *qend, *nextp;
qstart = *src;
nextp = qend = end;
}
*np = node_new_str(qstart, qend);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
*src = nextp;
}
break;
case TK_CHAR_TYPE:
- switch (tok->u.subtype) {
- case CTYPE_WORD:
- case CTYPE_NOT_WORD:
- *np = node_new_ctype(tok->u.subtype);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- break;
-
- case CTYPE_WHITE_SPACE:
- *np = node_new_cclass();
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_CODE_SPACE(env->enc, c)) BITSET_SET_BIT(NCCLASS(*np).bs, c);
- }
- break;
-
- case CTYPE_NOT_WHITE_SPACE:
- *np = node_new_cclass();
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_CODE_SPACE(env->enc, c)) BITSET_SET_BIT(NCCLASS(*np).bs, c);
- }
- break;
+ {
+ switch (tok->u.subtype) {
+ case CTYPE_WORD:
+ case CTYPE_NOT_WORD:
+ *np = node_new_ctype(tok->u.subtype);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ break;
- case CTYPE_DIGIT:
- *np = node_new_cclass();
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (IS_CODE_DIGIT(env->enc, c)) BITSET_SET_BIT(NCCLASS(*np).bs, c);
- }
- break;
+ case CTYPE_WHITE_SPACE:
+ case CTYPE_NOT_WHITE_SPACE:
+ case CTYPE_DIGIT:
+ case CTYPE_NOT_DIGIT:
+ {
+ CClassNode* cc;
+ int ctype, not;
+
+ ctype = parse_ctype_to_enc_ctype(tok->u.subtype, ¬);
+
+ *np = node_new_cclass();
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ cc = &(NCCLASS(*np));
+ add_ctype_to_cc(cc, ctype, 0, env);
+ if (not != 0) CCLASS_SET_NOT(cc);
+ }
+ break;
- case CTYPE_NOT_DIGIT:
- *np = node_new_cclass();
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
- for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
- if (! IS_CODE_DIGIT(env->enc, c)) BITSET_SET_BIT(NCCLASS(*np).bs, c);
+ default:
+ return ONIGERR_PARSER_BUG;
+ break;
}
- break;
-
- default:
- return REGERR_PARSER_BUG;
- break;
}
break;
+ case TK_CHAR_PROPERTY:
+ r = parse_char_property(np, tok, src, end, env);
+ if (r != 0) return r;
+ break;
+
case TK_CC_OPEN:
r = parse_char_class(np, tok, src, end, env);
if (r != 0) return r;
+
+#ifdef USE_FOLD_MATCH
+ if (IS_IGNORECASE(env->option) && ONIGENC_IS_FOLD_MATCH(env->enc)) {
+ int res;
+ Node *alt_root, *work;
+ CClassNode* cc = &(NCCLASS(*np));
+
+ res = make_fold_alt_node_from_cc(env->enc, cc, &alt_root);
+ if (res < 0) return res;
+ if (res > 0) {
+ work = node_new_alt(*np, alt_root);
+ if (IS_NULL(work)) {
+ onig_node_free(alt_root);
+ return ONIGERR_MEMORY;
+ }
+ *np = work;
+ }
+ }
+#endif
break;
case TK_ANYCHAR:
*np = node_new_anychar();
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ break;
+
+ case TK_ANYCHAR_ANYTIME:
+ *np = node_new_anychar();
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
+ qn = node_new_qualifier(0, REPEAT_INFINITE, 0);
+ CHECK_NULL_RETURN_VAL(qn, ONIGERR_MEMORY);
+ NQUALIFIER(qn).target = *np;
+ *np = qn;
break;
case TK_BACKREF:
len = tok->u.backref.num;
*np = node_new_backref(len,
- (len > 1 ? tok->u.backref.refs : &(tok->u.backref.ref1)), env);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+ (len > 1 ? tok->u.backref.refs : &(tok->u.backref.ref1)),
+ tok->u.backref.by_name, env);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
break;
#ifdef USE_SUBEXP_CALL
case TK_CALL:
*np = node_new_call(tok->u.call.name, tok->u.call.name_end);
- CHECK_NULL_RETURN_VAL(*np, REGERR_MEMORY);
+ CHECK_NULL_RETURN_VAL(*np, ONIGERR_MEMORY);
env->num_call++;
break;
#endif
case TK_ANCHOR:
- *np = regex_node_new_anchor(tok->u.anchor);
+ *np = onig_node_new_anchor(tok->u.anchor);
break;
case TK_OP_REPEAT:
case TK_INTERVAL:
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_CONTEXT_INDEP_OPS)) {
- if (IS_SYNTAX_BV(env->syntax, REG_SYN_CONTEXT_INVALID_OPS))
- return REGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED;
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS)) {
+ if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS))
+ return ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED;
else
*np = node_new_empty();
}
break;
default:
- return REGERR_PARSER_BUG;
+ return ONIGERR_PARSER_BUG;
break;
}
- re_entry:
- r = fetch_token(tok, src, end, env);
- if (r < 0) return r;
-
- repeat:
- if (r == TK_OP_REPEAT || r == TK_INTERVAL) {
- if (is_invalid_qualifier_target(*np))
- return REGERR_TARGET_OF_REPEAT_OPERATOR_INVALID;
+ {
+ targetp = np;
- qn = node_new_qualifier(tok->u.repeat.lower, tok->u.repeat.upper,
- (r == TK_INTERVAL ? 1 : 0));
- CHECK_NULL_RETURN_VAL(qn, REGERR_MEMORY);
- NQUALIFIER(qn).greedy = tok->u.repeat.greedy;
- r = set_qualifier(qn, *np, group, env);
+ re_entry:
+ r = fetch_token(tok, src, end, env);
if (r < 0) return r;
- if (tok->u.repeat.possessive != 0) {
- Node* en;
- en = node_new_effect(EFFECT_STOP_BACKTRACK);
- CHECK_NULL_RETURN_VAL(en, REGERR_MEMORY);
- NEFFECT(en).target = qn;
- qn = en;
- }
+ repeat:
+ if (r == TK_OP_REPEAT || r == TK_INTERVAL) {
+ if (is_invalid_qualifier_target(*targetp))
+ return ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID;
- if (r == 0) {
- *np = qn;
- }
- else if (r == 2) { /* split case: /abc+/ */
- Node* target = *np;
- *np = node_new_list(target, NULL);
- NCONS(*np).right = node_new_list(qn, NULL);
+ qn = node_new_qualifier(tok->u.repeat.lower, tok->u.repeat.upper,
+ (r == TK_INTERVAL ? 1 : 0));
+ CHECK_NULL_RETURN_VAL(qn, ONIGERR_MEMORY);
+ NQUALIFIER(qn).greedy = tok->u.repeat.greedy;
+ r = set_qualifier(qn, *targetp, group, env);
+ if (r < 0) return r;
+
+ if (tok->u.repeat.possessive != 0) {
+ Node* en;
+ en = node_new_effect(EFFECT_STOP_BACKTRACK);
+ CHECK_NULL_RETURN_VAL(en, ONIGERR_MEMORY);
+ NEFFECT(en).target = qn;
+ qn = en;
+ }
+
+ if (r == 0) {
+ *targetp = qn;
+ }
+ else if (r == 2) { /* split case: /abc+/ */
+ Node *tmp;
+
+ *targetp = node_new_list(*targetp, NULL);
+ CHECK_NULL_RETURN_VAL(*targetp, ONIGERR_MEMORY);
+ tmp = NCONS(*targetp).right = node_new_list(qn, NULL);
+ CHECK_NULL_RETURN_VAL(tmp, ONIGERR_MEMORY);
+ targetp = &(NCONS(tmp).left);
+ }
+ goto re_entry;
}
- goto re_entry;
}
return r;
}
static int
-parse_branch(Node** top, RegToken* tok, int term,
+parse_branch(Node** top, OnigToken* tok, int term,
UChar** src, UChar* end, ScanEnv* env)
{
int r;
/* term_tok: TK_EOT or TK_SUBEXP_CLOSE */
static int
-parse_subexp(Node** top, RegToken* tok, int term,
+parse_subexp(Node** top, OnigToken* tok, int term,
UChar** src, UChar* end, ScanEnv* env)
{
int r;
*top = NULL;
r = parse_branch(&node, tok, term, src, end, env);
- if (r < 0) return r;
+ if (r < 0) {
+ onig_node_free(node);
+ return r;
+ }
if (r == term) {
*top = node;
else {
err:
if (term == TK_SUBEXP_CLOSE)
- return REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;
+ return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;
else
- return REGERR_PARSER_BUG;
+ return ONIGERR_PARSER_BUG;
}
return r;
parse_regexp(Node** top, UChar** src, UChar* end, ScanEnv* env)
{
int r;
- RegToken tok;
+ OnigToken tok;
r = fetch_token(&tok, src, end, env);
if (r < 0) return r;
}
extern int
-regex_parse_make_tree(Node** root, UChar* pattern, UChar* end, regex_t* reg,
+onig_parse_make_tree(Node** root, UChar* pattern, UChar* end, regex_t* reg,
ScanEnv* env)
{
int r;
UChar* p;
-#ifdef USE_NAMED_SUBEXP
+#ifdef USE_NAMED_GROUP
names_clear(reg);
#endif
}
extern void
-regex_scan_env_set_error_string(ScanEnv* env, int ecode,
+onig_scan_env_set_error_string(ScanEnv* env, int ecode,
UChar* arg, UChar* arg_end)
{
env->error = arg;
regparse.h - Oniguruma (regular expression library)
- Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#ifndef REGPARSE_H
#define NSTRING_LEN(node) ((node)->u.str.end - (node)->u.str.s)
#define NSTRING_SET_RAW(node) (node)->u.str.flag |= NSTR_RAW
+#define NSTRING_CLEAR_RAW(node) (node)->u.str.flag &= ~NSTR_RAW
#define NSTRING_SET_CASE_AMBIG(node) (node)->u.str.flag |= NSTR_CASE_AMBIG
#define NSTRING_IS_RAW(node) (((node)->u.str.flag & NSTR_RAW) != 0)
#define NSTRING_IS_CASE_AMBIG(node) \
#define BACKREFS_P(br) \
(IS_NOT_NULL((br)->back_dynamic) ? (br)->back_dynamic : (br)->back_static);
+#define CCLASS_SET_NOT(cc) (cc)->not = 1
+
+#define NQ_TARGET_ISNOT_EMPTY 0
+#define NQ_TARGET_IS_EMPTY 1
+#define NQ_TARGET_IS_EMPTY_MEM 2
+#define NQ_TARGET_IS_EMPTY_REC 3
+
+
typedef struct {
UChar* s;
UChar* end;
int upper;
int greedy;
int by_number; /* {n,m} */
- int target_may_empty; /* target can match with empty data */
+ int target_empty_info;
struct _Node* head_exact;
struct _Node* next_head_exact;
int is_refered; /* include called node. don't eliminate even if {0} */
} QualifierNode;
/* status bits */
-#define NST_RECURSION (1<<0)
-#define NST_CALLED (1<<1)
-#define NST_ADDR_FIXED (1<<2)
-#define NST_MIN_FIXED (1<<3)
-#define NST_MAX_FIXED (1<<4)
-#define NST_CLEN_FIXED (1<<5)
-#define NST_MARK1 (1<<6)
-#define NST_MARK2 (1<<7)
-#define NST_MEM_BACKREFED (1<<8)
-#define NST_SIMPLE_REPEAT (1<<9) /* for stop backtrack optimization */
+#define NST_MIN_FIXED (1<<0)
+#define NST_MAX_FIXED (1<<1)
+#define NST_CLEN_FIXED (1<<2)
+#define NST_MARK1 (1<<3)
+#define NST_MARK2 (1<<4)
+#define NST_MEM_BACKREFED (1<<5)
+#define NST_SIMPLE_REPEAT (1<<6) /* for stop backtrack optimization */
+
+#define NST_RECURSION (1<<7)
+#define NST_CALLED (1<<8)
+#define NST_ADDR_FIXED (1<<9)
+#define NST_NAMED_GROUP (1<<10)
+#define NST_NAME_REF (1<<11)
#define SET_EFFECT_STATUS(node,f) (node)->u.effect.state |= (f)
#define CLEAR_EFFECT_STATUS(node,f) (node)->u.effect.state &= ~(f)
#define IS_EFFECT_MAX_FIXED(en) (((en)->state & NST_MAX_FIXED) != 0)
#define IS_EFFECT_CLEN_FIXED(en) (((en)->state & NST_CLEN_FIXED) != 0)
#define IS_EFFECT_SIMPLE_REPEAT(en) (((en)->state & NST_SIMPLE_REPEAT) != 0)
+#define IS_EFFECT_NAMED_GROUP(en) (((en)->state & NST_NAMED_GROUP) != 0)
#define SET_CALL_RECURSION(node) (node)->u.call.state |= NST_RECURSION
#define IS_CALL_RECURSION(cn) (((cn)->state & NST_RECURSION) != 0)
+#define IS_CALL_NAME_REF(cn) (((cn)->state & NST_NAME_REF) != 0)
+#define IS_BACKREF_NAME_REF(bn) (((bn)->state & NST_NAME_REF) != 0)
typedef struct {
int state;
int type;
int regnum;
- RegOptionType option;
+ OnigOptionType option;
struct _Node* target;
AbsAddrType call_addr;
/* for multiple call reference */
- RegDistance min_len; /* min length (byte) */
- RegDistance max_len; /* max length (byte) */
+ OnigDistance min_len; /* min length (byte) */
+ OnigDistance max_len; /* max length (byte) */
int char_len; /* character length */
int opt_count; /* referenced count in optimize_node_left() */
} EffectNode;
(senv)->mem_nodes_dynamic : (senv)->mem_nodes_static)
typedef struct {
- RegOptionType option;
- RegCharEncoding enc;
- RegSyntaxType* syntax;
- BitStatusType backtrack_mem;
+ OnigOptionType option;
+ OnigEncoding enc;
+ OnigSyntaxType* syntax;
+ BitStatusType capture_history;
+ BitStatusType bt_mem_start;
+ BitStatusType bt_mem_end;
BitStatusType backrefed_mem;
UChar* pattern;
UChar* pattern_end;
UnsetAddrList* unset_addr_list;
#endif
int num_mem;
+#ifdef USE_NAMED_GROUP
+ int num_named;
+#endif
int mem_alloc;
Node* mem_nodes_static[SCANENV_MEMNODES_SIZE];
Node** mem_nodes_dynamic;
#define IS_SYNTAX_OP2(syn, opm) (((syn)->op2 & (opm)) != 0)
#define IS_SYNTAX_BV(syn, bvm) (((syn)->behavior & (bvm)) != 0)
-
-extern void regex_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));
-extern int regex_scan_unsigned_number P_((UChar** src, UChar* end, RegCharEncoding enc));
-extern void regex_node_conv_to_str_node P_((Node* node, int raw));
-extern int regex_node_str_cat P_((Node* node, UChar* s, UChar* end));
-extern void regex_node_free P_((Node* node));
-extern Node* regex_node_new_effect P_((int type));
-extern Node* regex_node_new_anchor P_((int type));
-extern int regex_free_node_list();
-extern int regex_names_free P_((regex_t* reg));
-extern int regex_parse_make_tree P_((Node** root, UChar* pattern, UChar* end, regex_t* reg, ScanEnv* env));
-
-#ifdef REG_DEBUG
-#ifdef USE_NAMED_SUBEXP
-extern int regex_print_names(FILE*, regex_t*);
+extern int onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc));
+extern int onig_strncmp P_((UChar* s1, UChar* s2, int n));
+extern void onig_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));
+extern int onig_scan_unsigned_number P_((UChar** src, UChar* end, OnigEncoding enc));
+extern void onig_reduce_nested_qualifier P_((Node* pnode, Node* cnode));
+extern void onig_node_conv_to_str_node P_((Node* node, int raw));
+extern int onig_node_str_cat P_((Node* node, UChar* s, UChar* end));
+extern void onig_node_free P_((Node* node));
+extern Node* onig_node_new_effect P_((int type));
+extern Node* onig_node_new_anchor P_((int type));
+extern int onig_free_node_list();
+extern int onig_names_free P_((regex_t* reg));
+extern int onig_parse_make_tree P_((Node** root, UChar* pattern, UChar* end, regex_t* reg, ScanEnv* env));
+
+#ifdef ONIG_DEBUG
+#ifdef USE_NAMED_GROUP
+extern int onig_print_names(FILE*, regex_t*);
#endif
#endif
regposerr.c - Oniguruma (regular expression library)
- Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#include "config.h"
regposix.c - Oniguruma (regular expression library)
- Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
+ Copyright (C) 2003-2004 K.Kosako (kosako@sofnec.co.jp)
**********************************************************************/
#if 1
#define ENC_STRING_LEN(enc,s,len) do { \
UChar* tmps = (UChar* )(s); \
- /* while (*tmps != 0) tmps += mblen(enc,*tmps); */ \
+ /* while (*tmps != 0) tmps += enc_len(enc,*tmps); */ \
while (*tmps != 0) tmps++; /* OK for UTF-8, EUC-JP, Shift_JIS */ \
len = tmps - (UChar* )(s); \
} while(0)
onig2posix_error_code(int code)
{
static O2PERR o2p[] = {
- { REG_MISMATCH, REG_NOMATCH },
- { REG_NO_SUPPORT_CONFIG, REG_EONIG_INTERNAL },
- { REGERR_MEMORY, REG_ESPACE },
- { REGERR_MATCH_STACK_LIMIT_OVER, REG_EONIG_INTERNAL },
- { REGERR_TYPE_BUG, REG_EONIG_INTERNAL },
- { REGERR_PARSER_BUG, REG_EONIG_INTERNAL },
- { REGERR_STACK_BUG, REG_EONIG_INTERNAL },
- { REGERR_UNDEFINED_BYTECODE, REG_EONIG_INTERNAL },
- { REGERR_UNEXPECTED_BYTECODE, REG_EONIG_INTERNAL },
- { REGERR_DEFAULT_ENCODING_IS_NOT_SETTED, REG_EONIG_BADARG },
- { REGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR, REG_EONIG_BADARG },
- { REGERR_END_PATTERN_AT_LEFT_BRACE, REG_EBRACE },
- { REGERR_END_PATTERN_AT_LEFT_BRACKET, REG_EBRACK },
- { REGERR_EMPTY_CHAR_CLASS, REG_ECTYPE },
- { REGERR_PREMATURE_END_OF_CHAR_CLASS, REG_ECTYPE },
- { REGERR_END_PATTERN_AT_BACKSLASH, REG_EESCAPE },
- { REGERR_END_PATTERN_AT_META, REG_EESCAPE },
- { REGERR_END_PATTERN_AT_CONTROL, REG_EESCAPE },
- { REGERR_META_CODE_SYNTAX, REG_BADPAT },
- { REGERR_CONTROL_CODE_SYNTAX, REG_BADPAT },
- { REGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE, REG_ECTYPE },
- { REGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE, REG_ECTYPE },
- { REGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS, REG_ECTYPE },
- { REGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED, REG_BADRPT },
- { REGERR_TARGET_OF_REPEAT_OPERATOR_INVALID, REG_BADRPT },
- { REGERR_NESTED_REPEAT_OPERATOR, REG_BADRPT },
- { REGERR_UNMATCHED_CLOSE_PARENTHESIS, REG_EPAREN },
- { REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS, REG_EPAREN },
- { REGERR_END_PATTERN_IN_GROUP, REG_BADPAT },
- { REGERR_UNDEFINED_GROUP_OPTION, REG_BADPAT },
- { REGERR_INVALID_POSIX_BRACKET_TYPE, REG_BADPAT },
- { REGERR_INVALID_LOOK_BEHIND_PATTERN, REG_BADPAT },
- { REGERR_INVALID_REPEAT_RANGE_PATTERN, REG_BADPAT },
- { REGERR_TOO_BIG_NUMBER, REG_BADPAT },
- { REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE, REG_BADBR },
- { REGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE, REG_BADBR },
- { REGERR_EMPTY_RANGE_IN_CHAR_CLASS, REG_ECTYPE },
- { REGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE, REG_ECTYPE },
- { REGERR_TOO_MANY_MULTI_BYTE_RANGES, REG_ECTYPE },
- { REGERR_TOO_SHORT_MULTI_BYTE_STRING, REG_BADPAT },
- { REGERR_TOO_BIG_BACKREF_NUMBER, REG_ESUBREG },
- { REGERR_INVALID_BACKREF, REG_ESUBREG },
- { REGERR_TOO_BIG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
- { REGERR_TOO_LONG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
- { REGERR_INVALID_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
- { REGERR_INVALID_SUBEXP_NAME, REG_BADPAT },
- { REGERR_UNDEFINED_NAME_REFERENCE, REG_BADPAT },
- { REGERR_UNDEFINED_GROUP_REFERENCE, REG_BADPAT },
- { REGERR_MULTIPLEX_DEFINITION_NAME_CALL, REG_BADPAT },
- { REGERR_NEVER_ENDING_RECURSION, REG_BADPAT },
- { REGERR_OVER_THREAD_PASS_LIMIT_COUNT, REG_EONIG_THREAD }
+ { ONIG_MISMATCH, REG_NOMATCH },
+ { ONIG_NO_SUPPORT_CONFIG, REG_EONIG_INTERNAL },
+ { ONIGERR_MEMORY, REG_ESPACE },
+ { ONIGERR_MATCH_STACK_LIMIT_OVER, REG_EONIG_INTERNAL },
+ { ONIGERR_TYPE_BUG, REG_EONIG_INTERNAL },
+ { ONIGERR_PARSER_BUG, REG_EONIG_INTERNAL },
+ { ONIGERR_STACK_BUG, REG_EONIG_INTERNAL },
+ { ONIGERR_UNDEFINED_BYTECODE, REG_EONIG_INTERNAL },
+ { ONIGERR_UNEXPECTED_BYTECODE, REG_EONIG_INTERNAL },
+ { ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED, REG_EONIG_BADARG },
+ { ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR, REG_EONIG_BADARG },
+ { ONIGERR_INVALID_ARGUMENT, REG_EONIG_BADARG },
+ { ONIGERR_END_PATTERN_AT_LEFT_BRACE, REG_EBRACE },
+ { ONIGERR_END_PATTERN_AT_LEFT_BRACKET, REG_EBRACK },
+ { ONIGERR_EMPTY_CHAR_CLASS, REG_ECTYPE },
+ { ONIGERR_PREMATURE_END_OF_CHAR_CLASS, REG_ECTYPE },
+ { ONIGERR_END_PATTERN_AT_BACKSLASH, REG_EESCAPE },
+ { ONIGERR_END_PATTERN_AT_META, REG_EESCAPE },
+ { ONIGERR_END_PATTERN_AT_CONTROL, REG_EESCAPE },
+ { ONIGERR_META_CODE_SYNTAX, REG_BADPAT },
+ { ONIGERR_CONTROL_CODE_SYNTAX, REG_BADPAT },
+ { ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE, REG_ECTYPE },
+ { ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE, REG_ECTYPE },
+ { ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS, REG_ECTYPE },
+ { ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED, REG_BADRPT },
+ { ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID, REG_BADRPT },
+ { ONIGERR_NESTED_REPEAT_OPERATOR, REG_BADRPT },
+ { ONIGERR_UNMATCHED_CLOSE_PARENTHESIS, REG_EPAREN },
+ { ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS, REG_EPAREN },
+ { ONIGERR_END_PATTERN_IN_GROUP, REG_BADPAT },
+ { ONIGERR_UNDEFINED_GROUP_OPTION, REG_BADPAT },
+ { ONIGERR_INVALID_POSIX_BRACKET_TYPE, REG_BADPAT },
+ { ONIGERR_INVALID_LOOK_BEHIND_PATTERN, REG_BADPAT },
+ { ONIGERR_INVALID_REPEAT_RANGE_PATTERN, REG_BADPAT },
+ { ONIGERR_TOO_BIG_NUMBER, REG_BADPAT },
+ { ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE, REG_BADBR },
+ { ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE, REG_BADBR },
+ { ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS, REG_ECTYPE },
+ { ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE, REG_ECTYPE },
+ { ONIGERR_TOO_MANY_MULTI_BYTE_RANGES, REG_ECTYPE },
+ { ONIGERR_TOO_SHORT_MULTI_BYTE_STRING, REG_BADPAT },
+ { ONIGERR_TOO_BIG_BACKREF_NUMBER, REG_ESUBREG },
+ { ONIGERR_INVALID_BACKREF, REG_ESUBREG },
+ { ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED, REG_BADPAT },
+ { ONIGERR_TOO_BIG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
+ { ONIGERR_TOO_LONG_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
+ { ONIGERR_INVALID_WIDE_CHAR_VALUE, REG_EONIG_BADWC },
+ { ONIGERR_EMPTY_GROUP_NAME, REG_BADPAT },
+ { ONIGERR_INVALID_GROUP_NAME, REG_BADPAT },
+ { ONIGERR_INVALID_CHAR_IN_GROUP_NAME, REG_BADPAT },
+ { ONIGERR_UNDEFINED_NAME_REFERENCE, REG_BADPAT },
+ { ONIGERR_UNDEFINED_GROUP_REFERENCE, REG_BADPAT },
+ { ONIGERR_MULTIPLEX_DEFINED_NAME, REG_BADPAT },
+ { ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL, REG_BADPAT },
+ { ONIGERR_NEVER_ENDING_RECURSION, REG_BADPAT },
+ { ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY, REG_BADPAT },
+ { ONIGERR_INVALID_CHAR_PROPERTY_NAME, REG_BADPAT },
+ { ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT, REG_EONIG_THREAD }
+
};
int i;
regcomp(regex_t* reg, const char* pattern, int posix_options)
{
int r, len;
- RegSyntaxType* syntax = RegDefaultSyntax;
- RegOptionType options;
+ OnigSyntaxType* syntax = OnigDefaultSyntax;
+ OnigOptionType options;
if ((posix_options & REG_EXTENDED) == 0)
- syntax = REG_SYNTAX_POSIX_BASIC;
+ syntax = ONIG_SYNTAX_POSIX_BASIC;
options = syntax->options;
if ((posix_options & REG_ICASE) != 0)
- REG_OPTION_ON(options, REG_OPTION_IGNORECASE);
+ ONIG_OPTION_ON(options, ONIG_OPTION_IGNORECASE);
if ((posix_options & REG_NEWLINE) != 0) {
- REG_OPTION_ON( options, REG_OPTION_NEGATE_SINGLELINE);
- REG_OPTION_OFF(options, REG_OPTION_SINGLELINE);
+ ONIG_OPTION_ON( options, ONIG_OPTION_NEGATE_SINGLELINE);
+ ONIG_OPTION_OFF(options, ONIG_OPTION_SINGLELINE);
}
reg->comp_options = posix_options;
- ENC_STRING_LEN(RegDefaultCharEncoding, pattern, len);
- r = regex_new(PONIG_C(reg), (UChar* )pattern, (UChar* )(pattern + len),
- options, RegDefaultCharEncoding, syntax, (RegErrorInfo* )NULL);
- if (r != REG_NORMAL) {
+ ENC_STRING_LEN(OnigEncDefaultCharEncoding, pattern, len);
+ r = onig_new(PONIG_C(reg), (UChar* )pattern, (UChar* )(pattern + len),
+ options, OnigEncDefaultCharEncoding, syntax,
+ (OnigErrorInfo* )NULL);
+ if (r != ONIG_NORMAL) {
return onig2posix_error_code(r);
}
{
int r, i, len;
UChar* end;
- RegOptionType options;
+ OnigOptionType options;
- options = REG_OPTION_POSIX_REGION;
- if ((posix_options & REG_NOTBOL) != 0) options |= REG_OPTION_NOTBOL;
- if ((posix_options & REG_NOTEOL) != 0) options |= REG_OPTION_NOTEOL;
+ options = ONIG_OPTION_POSIX_REGION;
+ if ((posix_options & REG_NOTBOL) != 0) options |= ONIG_OPTION_NOTBOL;
+ if ((posix_options & REG_NOTEOL) != 0) options |= ONIG_OPTION_NOTEOL;
if ((reg->comp_options & REG_NOSUB) != 0) {
pmatch = (regmatch_t* )NULL;
ENC_STRING_LEN(ONIG_C(reg)->code,str,len);
end = (UChar* )(str + len);
- r = regex_search(ONIG_C(reg), (UChar* )str, end, (UChar* )str, end,
- (RegRegion* )pmatch, options);
+ r = onig_search(ONIG_C(reg), (UChar* )str, end, (UChar* )str, end,
+ (OnigRegion* )pmatch, options);
if (r >= 0) {
r = 0; /* Match */
}
- else if (r == REG_MISMATCH) {
+ else if (r == ONIG_MISMATCH) {
r = REG_NOMATCH;
for (i = 0; i < nmatch; i++)
- pmatch[i].rm_so = pmatch[i].rm_eo = REG_REGION_NOTPOS;
+ pmatch[i].rm_so = pmatch[i].rm_eo = ONIG_REGION_NOTPOS;
}
else {
r = onig2posix_error_code(r);
extern void
regfree(regex_t* reg)
{
- regex_free(ONIG_C(reg));
+ onig_free(ONIG_C(reg));
}
extern void
reg_set_encoding(int mb_code)
{
- RegDefaultCharEncoding = REG_MBLEN_TABLE[mb_code];
+ OnigEncoding enc;
+
+ switch (mb_code) {
+ case REG_POSIX_ENCODING_ASCII:
+ enc = ONIG_ENCODING_ASCII;
+ break;
+ case REG_POSIX_ENCODING_EUC_JP:
+ enc = ONIG_ENCODING_EUC_JP;
+ break;
+ case REG_POSIX_ENCODING_SJIS:
+ enc = ONIG_ENCODING_SJIS;
+ break;
+ case REG_POSIX_ENCODING_UTF8:
+ enc = ONIG_ENCODING_UTF8;
+ break;
+ default:
+ return ;
+ break;
+ }
+
+ onigenc_set_default_encoding(enc);
}
extern int
reg_name_to_group_numbers(regex_t* reg,
unsigned char* name, unsigned char* name_end, int** nums)
{
- return regex_name_to_group_numbers(ONIG_C(reg), name, name_end, nums);
+ return onig_name_to_group_numbers(ONIG_C(reg), name, name_end, nums);
+}
+
+typedef struct {
+ int (*func)(unsigned char*,unsigned char*,int,int*,regex_t*,void*);
+ regex_t* reg;
+ void* arg;
+} i_wrap;
+
+static int i_wrapper(unsigned char* name, unsigned char* name_end,
+ int ng, int* gs,
+ onig_regex_t* reg, void* arg)
+{
+ i_wrap* warg = (i_wrap* )arg;
+
+ return (*warg->func)(name, name_end, ng, gs, warg->reg, warg->arg);
+}
+
+extern int
+reg_foreach_name(regex_t* reg,
+ int (*func)(unsigned char*,unsigned char*,int,int*,regex_t*,void*),
+ void* arg)
+{
+ i_wrap warg;
+
+ warg.func = func;
+ warg.reg = reg;
+ warg.arg = arg;
+
+ return onig_foreach_name(ONIG_C(reg), i_wrapper, &warg);
}
extern int
-reg_foreach_name(regex_t* reg, int (*func)(unsigned char*,int,int*,void*),
- void* arg)
+reg_number_of_names(regex_t* reg)
{
- return regex_foreach_name(ONIG_C(reg), func, arg);
+ return onig_number_of_names(ONIG_C(reg));
}
+++ /dev/null
-/*
- * names.c -- example of group name callback.
- */
-#include<stdio.h>
-#include "oniguruma.h"
-
-static int
-name_callback(UChar* name, int ngroup_num, int* group_nums, void* arg)
-{
- int i, gn;
- RegRegion *region = (RegRegion* )arg;
-
- for (i = 0; i < ngroup_num; i++) {
- gn = group_nums[i];
- fprintf(stderr, "%s (%d): ", name, gn);
- fprintf(stderr, "(%d-%d)\n", region->beg[gn], region->end[gn]);
- }
- return 0; /* 0: continue */
-}
-
-extern int main(int argc, char* argv[])
-{
- int r;
- unsigned char *start, *range, *end;
- regex_t* reg;
- RegErrorInfo einfo;
- RegRegion *region;
-
- static unsigned char* pattern = "(?<foo>a*)(?<bar>b*)(?<foo>c*)";
- static unsigned char* str = "aaabbbbcc";
-
- r = regex_new(®, pattern, pattern + strlen(pattern),
- REG_OPTION_DEFAULT, REGCODE_ASCII, REG_SYNTAX_DEFAULT, &einfo);
- if (r != REG_NORMAL) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r, &einfo);
- fprintf(stderr, "ERROR: %s\n", s);
- exit(-1);
- }
-
- region = regex_region_new();
-
- end = str + strlen(str);
- start = str;
- range = end;
- r = regex_search(reg, str, end, start, range, region, REG_OPTION_NONE);
- if (r >= 0) {
- fprintf(stderr, "match at %d\n\n", r);
- r = regex_foreach_name(reg, name_callback, (void* )region);
- }
- else if (r == REG_MISMATCH) {
- fprintf(stderr, "search fail\n");
- }
- else { /* error */
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r);
- exit(-1);
- }
-
- regex_region_free(region, 1 /* 1:free self, 0:free contents only */);
- regex_free(reg);
- regex_end();
- return 0;
-}
+++ /dev/null
-/*
- * posix.c
- */
-#include<stdio.h>
-#include "onigposix.h"
-
-static int x(regex_t* reg, unsigned char* pattern, unsigned char* str)
-{
- int r, i;
- char buf[200];
- regmatch_t pmatch[20];
-
- r = regexec(reg, str, reg->re_nsub + 1, pmatch, 0);
- if (r != 0 && r != REG_NOMATCH) {
- regerror(r, reg, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
-
- if (r == REG_NOMATCH) {
- fprintf(stderr, "FAIL: /%s/ '%s'\n", pattern, str);
- }
- else {
- fprintf(stderr, "OK: /%s/ '%s'\n", pattern, str);
- for (i = 0; i <= reg->re_nsub; i++) {
- fprintf(stderr, "%d: %d-%d\n", i, pmatch[i].rm_so, pmatch[i].rm_eo);
- }
- }
- return 0;
-}
-
-extern int main(int argc, char* argv[])
-{
- int r;
- char buf[200];
- regex_t reg;
- unsigned char* pattern;
-
- /* default syntax (REG_SYNTAX_RUBY) */
- pattern = "^a+b{2,7}[c-f]?$|uuu";
- r = regcomp(®, pattern, REG_EXTENDED);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
- x(®, pattern, "aaabbbbd");
-
- /* POSIX Basic RE (REG_EXTENDED is not specified.) */
- pattern = "^a+b{2,7}[c-f]?|uuu";
- r = regcomp(®, pattern, 0);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
- x(®, pattern, "a+b{2,7}d?|uuu");
-
- /* POSIX Basic RE (REG_EXTENDED is not specified.) */
- pattern = "^a*b\\{2,7\\}\\([c-f]\\)$";
- r = regcomp(®, pattern, 0);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
- x(®, pattern, "aaaabbbbbbd");
-
- /* POSIX Extended RE */
- regex_set_default_syntax(REG_SYNTAX_POSIX_EXTENDED);
- pattern = "^a+b{2,7}[c-f]?)$|uuu";
- r = regcomp(®, pattern, REG_EXTENDED);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
- x(®, pattern, "aaabbbbd)");
-
- pattern = "^b.";
- r = regcomp(®, pattern, REG_EXTENDED | REG_NEWLINE);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
- }
- x(®, pattern, "a\nb\n");
-
- regfree(®);
- regex_end();
- return 0;
-}
+++ /dev/null
-/*
- * simple.c
- */
-#include<stdio.h>
-#include "oniguruma.h"
-
-extern int main(int argc, char* argv[])
-{
- int r;
- unsigned char *start, *range, *end;
- regex_t* reg;
- RegErrorInfo einfo;
- RegRegion *region;
-
- static unsigned char* pattern = "a(.*)b|[e-f]+";
- static unsigned char* str = "zzzzaffffffffb";
-
- r = regex_new(®, pattern, pattern + strlen(pattern),
- REG_OPTION_DEFAULT, REGCODE_ASCII, REG_SYNTAX_DEFAULT, &einfo);
- if (r != REG_NORMAL) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r, &einfo);
- fprintf(stderr, "ERROR: %s\n", s);
- exit(-1);
- }
-
- region = regex_region_new();
-
- end = str + strlen(str);
- start = str;
- range = end;
- r = regex_search(reg, str, end, start, range, region, REG_OPTION_NONE);
- if (r >= 0) {
- int i;
-
- fprintf(stderr, "match at %d\n", r);
- for (i = 0; i < region->num_regs; i++) {
- fprintf(stderr, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]);
- }
- }
- else if (r == REG_MISMATCH) {
- fprintf(stderr, "search fail\n");
- }
- else { /* error */
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r);
- exit(-1);
- }
-
- regex_region_free(region, 1 /* 1:free self, 0:free contents only */);
- regex_free(reg);
- regex_end();
- return 0;
-}
+++ /dev/null
-# test.rb
-# Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
-
-def pr(result, reg, str, n = 0, *range)
- printf("%s /%s/:'%s'", result, reg.source, str)
- if (n.class == Fixnum)
- printf(":%d", n) if n != 0
- if (range.size > 0)
- if (range[3].nil?)
- printf(" (%d-%d : X-X)", range[0], range[1])
- else
- printf(" (%d-%d : %d-%d)", range[0], range[1], range[2], range[3])
- end
- end
- else
- printf(" %s", n)
- end
- printf("\n")
-end
-
-def rok(result_opt, reg, str, n = 0, *range)
- result = "OK" + result_opt
- result += " " * (7 - result.length)
- pr(result, reg, str, n, *range)
- $rok += 1
-end
-
-def rfail(result_opt, reg, str, n = 0, *range)
- result = "FAIL" + result_opt
- result += " " * (7 - result.length)
- pr(result, reg, str, n, *range)
- $rfail += 1
-end
-
-def x(reg, str, s, e, n = 0)
- m = reg.match(str)
- if m
- if (m.size() <= n)
- rfail("(%d)" % (m.size()-1), reg, str, n)
- else
- if (m.begin(n) == s && m.end(n) == e)
- rok("", reg, str, n)
- else
- rfail("", reg, str, n, s, e, m.begin(n), m.end(n))
- end
- end
- else
- rfail("", reg, str, n)
- end
-end
-
-def n(reg, str)
- m = reg.match(str)
- if m
- rfail("(N)", reg, str, 0)
- else
- rok("(N)", reg, str, 0)
- end
-end
-
-def r(reg, str, index, pos = nil)
- if (pos)
- res = str.rindex(reg, pos)
- else
- res = str.rindex(reg)
- end
- if res
- if (res == index)
- rok("(r)", reg, str)
- else
- rfail("(r)", reg, str, [res, '-', index])
- end
- else
- rfail("(r)", reg, str)
- end
-end
-
-def i(reg, str, s = 0, e = 0, n = 0)
- # ignore
-end
-
-### main ###
-$rok = $rfail = 0
-
-
-def test_sb(enc)
-$KCODE = enc
-
-
-x(//, '', 0, 0)
-x(/^/, '', 0, 0)
-x(/$/, '', 0, 0)
-x(/\G/, '', 0, 0)
-x(/\A/, '', 0, 0)
-x(/\Z/, '', 0, 0)
-x(/\z/, '', 0, 0)
-x(/^$/, '', 0, 0)
-x(/\ca/, "\001", 0, 1)
-x(/\C-b/, "\002", 0, 1)
-x(/\M-Z/, "\xDA", 0, 1)
-x(//, 'a', 0, 0)
-x(/a/, 'a', 0, 1)
-x(/aa/, 'aa', 0, 2)
-x(/aaa/, 'aaa', 0, 3)
-x(/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 0, 35)
-x(/ab/, 'ab', 0, 2)
-x(/b/, 'ab', 1, 2)
-x(/bc/, 'abc', 1, 3)
-x(/\17/, "\017", 0, 1)
-x(/\x1f/, "\x1f", 0, 1)
-x(/\xFE/, "\xfe", 0, 1)
-x(/a(?#....\\JJJJ)b/, 'ab', 0, 2)
-x(/./, 'a', 0, 1)
-n(/./, '')
-x(/../, 'ab', 0, 2)
-x(/\w/, 'e', 0, 1)
-n(/\W/, 'e')
-x(/\s/, ' ', 0, 1)
-x(/\S/, 'b', 0, 1)
-x(/\d/, '4', 0, 1)
-n(/\D/, '4')
-x(/\b/, 'z ', 0, 0)
-x(/\b/, ' z', 1, 1)
-x(/\B/, 'zz ', 1, 1)
-x(/\B/, 'z ', 2, 2)
-x(/\B/, ' z', 0, 0)
-x(/[ab]/, 'b', 0, 1)
-n(/[ab]/, 'c')
-x(/[a-z]/, 't', 0, 1)
-n(/[^a]/, 'a')
-x(/[^a]/, "\n", 0, 1)
-x(/[]]/, ']', 0, 1)
-n(/[^]]/, ']')
-x(/[b-]/, 'b', 0, 1)
-x(/[b-]/, '-', 0, 1)
-x(/[\w]/, 'z', 0, 1)
-n(/[\w]/, ' ')
-x(/[\d]/, '5', 0, 1)
-n(/[\d]/, 'e')
-x(/[\D]/, 't', 0, 1)
-n(/[\D]/, '3')
-x(/[\s]/, ' ', 0, 1)
-n(/[\s]/, 'a')
-x(/[\S]/, 'b', 0, 1)
-n(/[\S]/, ' ')
-x(/[\w\d]/, '2', 0, 1)
-n(/[\w\d]/, ' ')
-x(/[[:upper:]]/, 'B', 0, 1)
-x(/[*[:xdigit:]+]/, '+', 0, 1)
-x(/[*[:xdigit:]+]/, 'GHIKK-9+*', 6, 7)
-x(/[*[:xdigit:]+]/, '-@^+', 3, 4)
-n(/[[:upper]]/, 'A')
-x(/[[:upper]]/, ':', 0, 1)
-x(/[\044-\047]/, "\046", 0, 1)
-x(/[\x5a-\x5c]/, "\x5b", 0, 1)
-x(/[\x6A-\x6D]/, "\x6c", 0, 1)
-n(/[\x6A-\x6D]/, "\x6E")
-n(/^[0-9A-F]+ 0+ UNDEF /, '75F 00000000 SECT14A notype () External | _rb_apply')
-x(/[\[]/, '[', 0, 1)
-x(/[\]]/, ']', 0, 1)
-x(/[&]/, '&', 0, 1)
-x(/[[ab]]/, 'b', 0, 1)
-x(/[[ab]c]/, 'c', 0, 1)
-n(/[[^a]]/, 'a')
-n(/[^[a]]/, 'a')
-x(/[[ab]&&bc]/, 'b', 0, 1)
-n(/[[ab]&&bc]/, 'a')
-n(/[[ab]&&bc]/, 'c')
-x(/[a-z&&b-y&&c-x]/, 'w', 0, 1)
-n(/[^a-z&&b-y&&c-x]/, 'w')
-x(/[[^a&&a]&&a-z]/, 'b', 0, 1)
-n(/[[^a&&a]&&a-z]/, 'a')
-x(/[[^a-z&&bcdef]&&[^c-g]]/, 'h', 0, 1)
-n(/[[^a-z&&bcdef]&&[^c-g]]/, 'c')
-x(/[^[^abc]&&[^cde]]/, 'c', 0, 1)
-x(/[^[^abc]&&[^cde]]/, 'e', 0, 1)
-n(/[^[^abc]&&[^cde]]/, 'f')
-x(/[a-&&-a]/, '-', 0, 1)
-n(/[a-&&-a]/, '&')
-n(/\wabc/, ' abc')
-x(/a\Wbc/, 'a bc', 0, 4)
-x(/a.b.c/, 'aabbc', 0, 5)
-x(/.\wb\W..c/, 'abb bcc', 0, 7)
-x(/\s\wzzz/, ' zzzz', 0, 5)
-x(/aa.b/, 'aabb', 0, 4)
-n(/.a/, 'ab')
-x(/.a/, 'aa', 0, 2)
-x(/^a/, 'a', 0, 1)
-x(/^a$/, 'a', 0, 1)
-x(/^\w$/, 'a', 0, 1)
-n(/^\w$/, ' ')
-x(/^\wab$/, 'zab', 0, 3)
-x(/^\wabcdef$/, 'zabcdef', 0, 7)
-x(/^\w...def$/, 'zabcdef', 0, 7)
-x(/\w\w\s\Waaa\d/, 'aa aaa4', 0, 8)
-x(/\A\Z/, '', 0, 0)
-x(/\Axyz/, 'xyz', 0, 3)
-x(/xyz\Z/, 'xyz', 0, 3)
-x(/xyz\z/, 'xyz', 0, 3)
-x(/\Gaz/, 'az', 0, 2)
-n(/\Gz/, 'bza')
-n(/az\G/, 'az')
-n(/az\A/, 'az')
-n(/a\Az/, 'az')
-x(/\^\$/, '^$', 0, 2)
-x(/\w/, '_', 0, 1)
-n(/\W/, '_')
-x(/(?=z)z/, 'z', 0, 1)
-n(/(?=z)./, 'a')
-x(/(?!z)a/, 'a', 0, 1)
-n(/(?!z)a/, 'z')
-x(/(?i:a)/, 'a', 0, 1)
-x(/(?i:a)/, 'A', 0, 1)
-x(/(?i:A)/, 'a', 0, 1)
-n(/(?i:A)/, 'b')
-x(/(?i:[A-Z])/, 'a', 0, 1)
-x(/(?i:[f-m])/, 'H', 0, 1)
-x(/(?i:[f-m])/, 'h', 0, 1)
-n(/(?i:[f-m])/, 'e')
-n(/(?i:[A-c])/, 'D') # changed spec. 2003/02/07
-n(/(?i:[a-C])/, 'D') # changed spec. 2003/02/07
-n(/(?i:[b-C])/, 'A')
-x(/(?i:[a-C])/, 'B', 0, 1)
-n(/(?i:[c-X])/, '[')
-n(/(?i:[!-k])/, 'Z')
-x(/(?i:[!-k])/, '7', 0, 1)
-n(/(?i:[T-}])/, 'b')
-x(/(?i:[T-}])/, '{', 0, 1)
-x(/(?i:\?a)/, '?A', 0, 2)
-x(/(?i:\*A)/, '*a', 0, 2)
-n(/./, "\n")
-x(/(?m:.)/, "\n", 0, 1)
-x(/(?m:a.)/, "a\n", 0, 2)
-x(/(?m:.b)/, "a\nb", 1, 3)
-x(/a?/, '', 0, 0)
-x(/a?/, 'b', 0, 0)
-x(/a?/, 'a', 0, 1)
-x(/a*/, '', 0, 0)
-x(/a*/, 'a', 0, 1)
-x(/a*/, 'aaa', 0, 3)
-x(/a*/, 'baaaa', 0, 0)
-n(/a+/, '')
-x(/a+/, 'a', 0, 1)
-x(/a+/, 'aaaa', 0, 4)
-x(/a+/, 'aabbb', 0, 2)
-x(/a+/, 'baaaa', 1, 5)
-x(/.?/, '', 0, 0)
-x(/.?/, 'f', 0, 1)
-x(/.?/, "\n", 0, 0)
-x(/.*/, '', 0, 0)
-x(/.*/, 'abcde', 0, 5)
-x(/.+/, 'z', 0, 1)
-x(/.+/, "zdswer\n", 0, 6)
-x(/a|b/, 'a', 0, 1)
-x(/a|b/, 'b', 0, 1)
-x(/|a/, 'a', 0, 0)
-x(/(|a)/, 'a', 0, 0)
-x(/ab|bc/, 'ab', 0, 2)
-x(/ab|bc/, 'bc', 0, 2)
-x(/z(?:ab|bc)/, 'zbc', 0, 3)
-x(/a(?:ab|bc)c/, 'aabc', 0, 4)
-x(/ab|(?:ac|az)/, 'az', 0, 2)
-x(/a|b|c/, 'dc', 1, 2)
-x(/a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz/, 'pqr', 0, 2)
-n(/a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz/, 'mn')
-x(/a|^z/, 'ba', 1, 2)
-x(/a|^z/, 'za', 0, 1)
-x(/a|\Gz/, 'bza', 2, 3)
-x(/a|\Gz/, 'za', 0, 1)
-x(/a|\Az/, 'bza', 2, 3)
-x(/a|\Az/, 'za', 0, 1)
-x(/a|b\Z/, 'ba', 1, 2)
-x(/a|b\Z/, 'b', 0, 1)
-x(/a|b\z/, 'ba', 1, 2)
-x(/a|b\z/, 'b', 0, 1)
-x(/\w|\s/, ' ', 0, 1)
-n(/\w|\w/, ' ')
-x(/\w|%/, '%', 0, 1)
-x(/\w|[&$]/, '&', 0, 1)
-x(/[b-d]|[^e-z]/, 'a', 0, 1)
-x(/(?:a|[c-f])|bz/, 'dz', 0, 1)
-x(/(?:a|[c-f])|bz/, 'bz', 0, 2)
-x(/abc|(?=zz)..f/, 'zzf', 0, 3)
-x(/abc|(?!zz)..f/, 'abf', 0, 3)
-x(/(?=za)..a|(?=zz)..a/, 'zza', 0, 3)
-n(/(?>a|abd)c/, 'abdc')
-x(/(?>abd|a)c/, 'abdc', 0, 4)
-x(/a?|b/, 'a', 0, 1)
-x(/a?|b/, 'b', 0, 0)
-x(/a?|b/, '', 0, 0)
-x(/a*|b/, 'aa', 0, 2)
-x(/a*|b*/, 'ba', 0, 0)
-x(/a*|b*/, 'ab', 0, 1)
-x(/a+|b*/, '', 0, 0)
-x(/a+|b*/, 'bbb', 0, 3)
-x(/a+|b*/, 'abbb', 0, 1)
-n(/a+|b+/, '')
-x(/(a|b)?/, 'b', 0, 1)
-x(/(a|b)*/, 'ba', 0, 2)
-x(/(a|b)+/, 'bab', 0, 3)
-x(/(ab|ca)+/, 'caabbc', 0, 4)
-x(/(ab|ca)+/, 'aabca', 1, 5)
-x(/(ab|ca)+/, 'abzca', 0, 2)
-x(/(a|bab)+/, 'ababa', 0, 5)
-x(/(a|bab)+/, 'ba', 1, 2)
-x(/(a|bab)+/, 'baaaba', 1, 4)
-x(/(?:a|b)(?:a|b)/, 'ab', 0, 2)
-x(/(?:a*|b*)(?:a*|b*)/, 'aaabbb', 0, 3)
-x(/(?:a*|b*)(?:a+|b+)/, 'aaabbb', 0, 6)
-x(/(?:a+|b+){2}/, 'aaabbb', 0, 6)
-x(/h{0,}/, 'hhhh', 0, 4)
-x(/(?:a+|b+){1,2}/, 'aaabbb', 0, 6)
-x(/(?:a+|\Ab*)cc/, 'cc', 0, 2)
-n(/(?:a+|\Ab*)cc/, 'abcc')
-x(/(?:^a+|b+)*c/, 'aabbbabc', 6, 8)
-x(/(?:^a+|b+)*c/, 'aabbbbc', 0, 7)
-x(/a|(?i)c/, 'C', 0, 1)
-x(/(?i)c|a/, 'C', 0, 1)
-i(/(?i)c|a/, 'A', 0, 1) # different spec.
-x(/(?i:c)|a/, 'C', 0, 1)
-n(/(?i:c)|a/, 'A')
-x(/[abc]?/, 'abc', 0, 1)
-x(/[abc]*/, 'abc', 0, 3)
-x(/[^abc]*/, 'abc', 0, 0)
-n(/[^abc]+/, 'abc')
-x(/a??/, 'aaa', 0, 0)
-x(/ba??b/, 'bab', 0, 3)
-x(/a*?/, 'aaa', 0, 0)
-x(/ba*?/, 'baa', 0, 1)
-x(/ba*?b/, 'baab', 0, 4)
-x(/a+?/, 'aaa', 0, 1)
-x(/ba+?/, 'baa', 0, 2)
-x(/ba+?b/, 'baab', 0, 4)
-x(/(?:a?)??/, 'a', 0, 0)
-x(/(?:a??)?/, 'a', 0, 0)
-x(/(?:a?)+?/, 'aaa', 0, 1)
-x(/(?:a+)??/, 'aaa', 0, 0)
-x(/(?:a+)??b/, 'aaab', 0, 4)
-i(/(?:ab)?{2}/, '', 0, 0) # GNU regex bug
-x(/(?:ab)?{2}/, 'ababa', 0, 4)
-x(/(?:ab)*{0}/, 'ababa', 0, 0)
-x(/(?:ab){3,}/, 'abababab', 0, 8)
-n(/(?:ab){3,}/, 'abab')
-x(/(?:ab){2,4}/, 'ababab', 0, 6)
-x(/(?:ab){2,4}/, 'ababababab', 0, 8)
-x(/(?:ab){2,4}?/, 'ababababab', 0, 4)
-x(/(?:ab){,}/, 'ab{,}', 0, 5)
-x(/(?:abc)+?{2}/, 'abcabcabc', 0, 6)
-x(/(?:X*)(?i:xa)/, 'XXXa', 0, 4)
-x(/(d+)([^abc]z)/, 'dddz', 0, 4)
-x(/([^abc]*)([^abc]z)/, 'dddz', 0, 4)
-x(/(\w+)(\wz)/, 'dddz', 0, 4)
-x(/(a)/, 'a', 0, 1, 1)
-x(/(ab)/, 'ab', 0, 2, 1)
-x(/((ab))/, 'ab', 0, 2)
-x(/((ab))/, 'ab', 0, 2, 1)
-x(/((ab))/, 'ab', 0, 2, 2)
-x(/((((((((((((((((((((ab))))))))))))))))))))/, 'ab', 0, 2, 20)
-x(/(ab)(cd)/, 'abcd', 0, 2, 1)
-x(/(ab)(cd)/, 'abcd', 2, 4, 2)
-x(/()(a)bc(def)ghijk/, 'abcdefghijk', 3, 6, 3)
-x(/(()(a)bc(def)ghijk)/, 'abcdefghijk', 3, 6, 4)
-x(/(^a)/, 'a', 0, 1)
-x(/(a)|(a)/, 'ba', 1, 2, 1)
-x(/(^a)|(a)/, 'ba', 1, 2, 2)
-x(/(a?)/, 'aaa', 0, 1, 1)
-x(/(a*)/, 'aaa', 0, 3, 1)
-x(/(a*)/, '', 0, 0, 1)
-x(/(a+)/, 'aaaaaaa', 0, 7, 1)
-x(/(a+|b*)/, 'bbbaa', 0, 3, 1)
-x(/(a+|b?)/, 'bbbaa', 0, 1, 1)
-x(/(abc)?/, 'abc', 0, 3, 1)
-x(/(abc)*/, 'abc', 0, 3, 1)
-x(/(abc)+/, 'abc', 0, 3, 1)
-x(/(xyz|abc)+/, 'abc', 0, 3, 1)
-x(/([xyz][abc]|abc)+/, 'abc', 0, 3, 1)
-x(/((?i:abc))/, 'AbC', 0, 3, 1)
-x(/(abc)(?i:\1)/, 'abcABC', 0, 6)
-x(/((?m:a.c))/, "a\nc", 0, 3, 1)
-x(/((?=az)a)/, 'azb', 0, 1, 1)
-x(/abc|(.abd)/, 'zabd', 0, 4, 1)
-x(/(?:abc)|(ABC)/, 'abc', 0, 3)
-x(/(?i:(abc))|(zzz)/, 'ABC', 0, 3, 1)
-x(/a*(.)/, 'aaaaz', 4, 5, 1)
-x(/a*?(.)/, 'aaaaz', 0, 1, 1)
-x(/a*?(c)/, 'aaaac', 4, 5, 1)
-x(/[bcd]a*(.)/, 'caaaaz', 5, 6, 1)
-x(/(\Abb)cc/, 'bbcc', 0, 2, 1)
-n(/(\Abb)cc/, 'zbbcc')
-x(/(^bb)cc/, 'bbcc', 0, 2, 1)
-n(/(^bb)cc/, 'zbbcc')
-x(/cc(bb$)/, 'ccbb', 2, 4, 1)
-n(/cc(bb$)/, 'ccbbb')
-#n(/\1/, 'a') # compile error on Oniguruma
-n(/(\1)/, '')
-n(/\1(a)/, 'aa')
-n(/(a(b)\1)\2+/, 'ababb')
-n(/(?:(?:\1|z)(a))+$/, 'zaa')
-x(/(?:(?:\1|z)(a))+$/, 'zaaa', 0, 4)
-x(/(a)(?=\1)/, 'aa', 0, 1)
-n(/(a)$|\1/, 'az')
-x(/(a)\1/, 'aa', 0, 2)
-n(/(a)\1/, 'ab')
-x(/(a?)\1/, 'aa', 0, 2)
-x(/(a??)\1/, 'aa', 0, 0)
-x(/(a*)\1/, 'aaaaa', 0, 4)
-x(/(a*)\1/, 'aaaaa', 0, 2, 1)
-x(/a(b*)\1/, 'abbbb', 0, 5)
-x(/a(b*)\1/, 'ab', 0, 1)
-x(/(a*)(b*)\1\2/, 'aaabbaaabb', 0, 10)
-x(/(a*)(b*)\2/, 'aaabbbb', 0, 7)
-x(/(((((((a*)b))))))c\7/, 'aaabcaaa', 0, 8)
-x(/(((((((a*)b))))))c\7/, 'aaabcaaa', 0, 3, 7)
-x(/(a)(b)(c)\2\1\3/, 'abcbac', 0, 6)
-x(/([a-d])\1/, 'cc', 0, 2)
-x(/(\w\d\s)\1/, 'f5 f5 ', 0, 6)
-n(/(\w\d\s)\1/, 'f5 f5')
-x(/(who|[a-c]{3})\1/, 'whowho', 0, 6)
-x(/...(who|[a-c]{3})\1/, 'abcwhowho', 0, 9)
-x(/(who|[a-c]{3})\1/, 'cbccbc', 0, 6)
-x(/(^a)\1/, 'aa', 0, 2)
-n(/(^a)\1/, 'baa')
-n(/(a$)\1/, 'aa')
-n(/(ab\Z)\1/, 'ab')
-x(/(a*\Z)\1/, 'a', 1, 1)
-x(/.(a*\Z)\1/, 'ba', 1, 2)
-x(/(.(abc)\2)/, 'zabcabc', 0, 7, 1)
-x(/(.(..\d.)\2)/, 'z12341234', 0, 9, 1)
-x(/((?i:az))\1/, 'AzAz', 0, 4)
-n(/((?i:az))\1/, 'Azaz')
-x(/(?<=a)b/, 'ab', 1, 2)
-n(/(?<=a)b/, 'bb')
-x(/(?<=a|b)b/, 'bb', 1, 2)
-x(/(?<=a|bc)b/, 'bcb', 2, 3)
-x(/(?<=a|bc)b/, 'ab', 1, 2)
-x(/(?<=a|bc||defghij|klmnopq|r)z/, 'rz', 1, 2)
-x(/(?<!a)b/, 'cb', 1, 2)
-n(/(?<!a)b/, 'ab')
-x(/(?<!a|bc)b/, 'bbb', 0, 1)
-n(/(?<!a|bc)z/, 'bcz')
-x(/(?<name1>a)/, 'a', 0, 1)
-x(/(?<name-2>ab)\1/, 'abab', 0, 4)
-x(/(?<name-3>.zv.)\k<name-3>/, 'azvbazvb', 0, 8)
-x(/(?<=\g<ab>)|-\zEND (?<ab>XyZ)/, 'XyZ', 3, 3)
-x(/(?<n>|a\g<n>)+/, '', 0, 0)
-x(/(?<n>|\(\g<n>\))+$/, '()(())', 0, 6)
-x(/\g<n>(?<n>.){0}/, 'X', 0, 1, 1)
-x(/\g<n>(abc|df(?<n>.YZ){2,8}){0}/, 'XYZ', 0, 3)
-x(/\A(?<n>(a\g<n>)|)\z/, 'aaaa', 0, 4)
-x(/(?<n>|\g<m>\g<n>)\z|\zEND (?<m>a|(b)\g<m>)/, 'bbbbabba', 0, 8)
-x(/(?<@:name[1240]>\w+\sx)a+\k<@:name[1240]>/, ' fg xaaaaaaaafg x', 2, 18)
-x(/(z)()()(?<9>a)\4/, 'zaa', 1, 2, 4)
-x(/(.)(((?<*>a)))\k<*>/, 'zaa', 0, 3)
-x(/((?<name1>\d)|(?<name2>\w))(\k<name1>|\k<name2>)/, 'ff', 0, 2)
-x(/(?:(?<x>)|(?<x>efg))\k<x>/, '', 0, 0)
-x(/(?:(?<@x>abc)|(?<@x>efg))\k<@x>/, 'abcefgefg', 3, 9)
-n(/(?:(?<@x>abc)|(?<@x>efg))\k<@x>/, 'abcefg')
-x(/(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\k<n1>$/, 'a-pyumpyum', 2, 10)
-x(/(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\k<n1>$/, 'xxxxabcdefghijklmnabcdefghijklmn', 4, 18, 14)
-x(/(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$/, 'aaa', 0, 3, 16)
-x(/(?<foo>a|\(\g<foo>\))/, 'a', 0, 1)
-x(/(?<foo>a|\(\g<foo>\))/, '((((((a))))))', 0, 13)
-x(/(?<foo>a|\(\g<foo>\))/, '((((((((a))))))))', 0, 17, 1)
-x(/\g<bar>|\zEND(?<bar>.*abc$)/, 'abcxxxabc', 0, 9)
-x(/\g<1>|\zEND(.a.)/, 'bac', 0, 3)
-x(/\g<2>\g<1>|\zEND(.a.)(?<?>.b.)/, 'xbxyay', 3, 6, 1)
-x(/\A(?:\g<pon>|\g<pan>|\zEND (?<pan>a|c\g<pon>c)(?<pon>b|d\g<pan>d))$/, 'cdcbcdc', 0, 7)
-x(/\A(?<n>|a\g<m>)\z|\zEND (?<m>\g<n>)/, 'aaaa', 0, 4)
-x(/(?<n>(a|b\g<n>c){3,5})/, 'baaaaca', 1, 5)
-x(/(?<n>(a|b\g<n>c){3,5})/, 'baaaacaaaaa', 0, 10)
-
-r(//, '', 0)
-r(/a/, 'a', 0)
-r(/a/, 'a', 0, 1)
-r(/b/, 'abc', 1)
-r(/b/, 'abc', 1, 2)
-r(/./, 'a', 0)
-r(/.*/, 'abcde fgh', 9)
-r(/a*/, 'aaabbc', 6)
-r(/a+/, 'aaabbc', 2)
-r(/a?/, 'bac', 3)
-r(/a??/, 'bac', 3)
-r(/abcde/, 'abcdeavcd', 0)
-r(/\w\d\s/, ' a2 aa $3 ', 2)
-r(/[c-f]aa[x-z]/, '3caaycaaa', 1)
-r(/(?i:fG)g/, 'fGgFggFgG', 3)
-r(/a|b/, 'b', 0)
-r(/ab|bc|cd/, 'bcc', 0)
-r(/(ffy)\1/, 'ffyffyffy', 3)
-r(/|z/, 'z', 1)
-r(/^az/, 'azaz', 0)
-r(/az$/, 'azaz', 2)
-r(/(((.a)))\3/, 'zazaaa', 0)
-r(/(ac*?z)\1/, 'aacczacczacz', 1)
-r(/aaz{3,4}/, 'bbaabbaazzzaazz', 6)
-r(/\000a/, "b\000a", 1)
-r(/ff\xfe/, "fff\xfe", 1)
-r(/...abcdefghijklmnopqrstuvwxyz/, 'zzzzzabcdefghijklmnopqrstuvwxyz', 2)
-end
-
-def test_euc(enc)
-$KCODE = enc
-
-x(//, '¤¢', 0, 0)
-x(/¤¢/, '¤¢', 0, 2)
-n(/¤¤/, '¤¢')
-x(/¤¦¤¦/, '¤¦¤¦', 0, 4)
-x(/¤¢¤¤¤¦/, '¤¢¤¤¤¦', 0, 6)
-x(/¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³/, '¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³', 0, 70)
-x(/¤¢/, '¤¤¤¢', 2, 4)
-x(/¤¤¤¦/, '¤¢¤¤¤¦', 2, 6)
-x(/\xca\xb8/, "\xca\xb8", 0, 2)
-x(/./, '¤¢', 0, 2)
-x(/../, '¤«¤', 0, 4)
-x(/\w/, '¤ª', 0, 2)
-n(/\W/, '¤¢')
-x(/\S/, '¤½', 0, 2)
-x(/\S/, '´Á', 0, 2)
-x(/\b/, 'µ¤ ', 0, 0)
-x(/\b/, ' ¤Û', 1, 1)
-x(/\B/, '¤»¤½ ', 2, 2)
-x(/\B/, '¤¦ ', 3, 3)
-x(/\B/, ' ¤¤', 0, 0)
-x(/[¤¿¤Á]/, '¤Á', 0, 2)
-n(/[¤Ê¤Ë]/, '¤Ì')
-x(/[¤¦-¤ª]/, '¤¨', 0, 2)
-n(/[^¤±]/, '¤±')
-x(/[\w]/, '¤Í', 0, 2)
-n(/[\d]/, '¤Õ')
-x(/[\D]/, '¤Ï', 0, 2)
-n(/[\s]/, '¤¯')
-x(/[\S]/, '¤Ø', 0, 2)
-x(/[\w\d]/, '¤è', 0, 2)
-x(/[\w\d]/, ' ¤è', 3, 5)
-#x(/[\xa4\xcf-\xa4\xd3]/, "\xa4\xd0", 0, 2) # diff spec with GNU regex.
-#n(/[\xb6\xe7-\xb6\xef]/, "\xb6\xe5") # diff spec with GNU regex.
-n(/\wµ´¼Ö/, ' µ´¼Ö')
-x(/µ´\W¼Ö/, 'µ´ ¼Ö', 0, 5)
-x(/¤¢.¤¤.¤¦/, '¤¢¤¢¤¤¤¤¤¦', 0, 10)
-x(/.\w¤¦\W..¤¾/, '¤¨¤¦¤¦ ¤¦¤¾¤¾', 0, 13)
-x(/\s\w¤³¤³¤³/, ' ¤³¤³¤³¤³', 0, 9)
-x(/¤¢¤¢.¤±/, '¤¢¤¢¤±¤±', 0, 8)
-n(/.¤¤/, '¤¤¤¨')
-x(/.¤ª/, '¤ª¤ª', 0, 4)
-x(/^¤¢/, '¤¢', 0, 2)
-x(/^¤à$/, '¤à', 0, 2)
-x(/^\w$/, '¤Ë', 0, 2)
-x(/^\w¤«¤¤¯¤±¤³$/, 'z¤«¤¤¯¤±¤³', 0, 11)
-x(/^\w...¤¦¤¨¤ª$/, 'z¤¢¤¤¤¦¤¦¤¨¤ª', 0, 13)
-x(/\w\w\s\W¤ª¤ª¤ª\d/, 'a¤ª ¤ª¤ª¤ª4', 0, 12)
-x(/\A¤¿¤Á¤Ä/, '¤¿¤Á¤Ä', 0, 6)
-x(/¤à¤á¤â\Z/, '¤à¤á¤â', 0, 6)
-x(/¤«¤¤¯\z/, '¤«¤¤¯', 0, 6)
-x(/¤«¤¤¯\Z/, "¤«¤¤¯\n", 0, 6)
-x(/\G¤Ý¤Ô/, '¤Ý¤Ô', 0, 4)
-n(/\G¤¨/, '¤¦¤¨¤ª')
-n(/¤È¤Æ\G/, '¤È¤Æ')
-n(/¤Þ¤ß\A/, '¤Þ¤ß')
-n(/¤Þ\A¤ß/, '¤Þ¤ß')
-x(/(?=¤»)¤»/, '¤»', 0, 2)
-n(/(?=¤¦)./, '¤¤')
-x(/(?!¤¦)¤«/, '¤«', 0, 2)
-n(/(?!¤È)¤¢/, '¤È')
-x(/(?i:¤¢)/, '¤¢', 0, 2)
-x(/(?i:¤Ö¤Ù)/, '¤Ö¤Ù', 0, 4)
-n(/(?i:¤¤)/, '¤¦')
-x(/(?m:¤è.)/, "¤è\n", 0, 3)
-x(/(?m:.¤á)/, "¤Þ\n¤á", 2, 5)
-x(/¤¢?/, '', 0, 0)
-x(/ÊÑ?/, '²½', 0, 0)
-x(/ÊÑ?/, 'ÊÑ', 0, 2)
-x(/ÎÌ*/, '', 0, 0)
-x(/ÎÌ*/, 'ÎÌ', 0, 2)
-x(/»Ò*/, '»Ò»Ò»Ò', 0, 6)
-x(/ÇÏ*/, '¼¯ÇÏÇÏÇÏÇÏ', 0, 0)
-n(/»³+/, '')
-x(/²Ï+/, '²Ï', 0, 2)
-x(/»þ+/, '»þ»þ»þ»þ', 0, 8)
-x(/¤¨+/, '¤¨¤¨¤¦¤¦¤¦', 0, 4)
-x(/¤¦+/, '¤ª¤¦¤¦¤¦¤¦', 2, 10)
-x(/.?/, '¤¿', 0, 2)
-x(/.*/, '¤Ñ¤Ô¤×¤Ú', 0, 8)
-x(/.+/, '¤í', 0, 2)
-x(/.+/, "¤¤¤¦¤¨¤«\n", 0, 8)
-x(/¤¢|¤¤/, '¤¢', 0, 2)
-x(/¤¢|¤¤/, '¤¤', 0, 2)
-x(/¤¢¤¤|¤¤¤¦/, '¤¢¤¤', 0, 4)
-x(/¤¢¤¤|¤¤¤¦/, '¤¤¤¦', 0, 4)
-x(/¤ò(?:¤«¤|¤¤¯)/, '¤ò¤«¤', 0, 6)
-x(/¤ò(?:¤«¤|¤¤¯)¤±/, '¤ò¤¤¯¤±', 0, 8)
-x(/¤¢¤¤|(?:¤¢¤¦|¤¢¤ò)/, '¤¢¤ò', 0, 4)
-x(/¤¢|¤¤|¤¦/, '¤¨¤¦', 2, 4)
-x(/¤¢|¤¤|¤¦¤¨|¤ª¤«¤|¤¯|¤±¤³¤µ|¤·¤¹¤»|¤½|¤¿¤Á|¤Ä¤Æ¤È¤Ê¤Ë|¤Ì¤Í/, '¤·¤¹¤»', 0, 6)
-n(/¤¢|¤¤|¤¦¤¨|¤ª¤«¤|¤¯|¤±¤³¤µ|¤·¤¹¤»|¤½|¤¿¤Á|¤Ä¤Æ¤È¤Ê¤Ë|¤Ì¤Í/, '¤¹¤»')
-x(/¤¢|^¤ï/, '¤Ö¤¢', 2, 4)
-x(/¤¢|^¤ò/, '¤ò¤¢', 0, 2)
-x(/µ´|\G¼Ö/, '¤±¼Öµ´', 4, 6)
-x(/µ´|\G¼Ö/, '¼Öµ´', 0, 2)
-x(/µ´|\A¼Ö/, 'b¼Öµ´', 3, 5)
-x(/µ´|\A¼Ö/, '¼Ö', 0, 2)
-x(/µ´|¼Ö\Z/, '¼Öµ´', 2, 4)
-x(/µ´|¼Ö\Z/, '¼Ö', 0, 2)
-x(/µ´|¼Ö\Z/, "¼Ö\n", 0, 2)
-x(/µ´|¼Ö\z/, '¼Öµ´', 2, 4)
-x(/µ´|¼Ö\z/, '¼Ö', 0, 2)
-x(/\w|\s/, '¤ª', 0, 2)
-x(/\w|%/, '%¤ª', 0, 1)
-x(/\w|[&$]/, '¤¦&', 0, 2)
-x(/[¤¤-¤±]/, '¤¦', 0, 2)
-x(/[¤¤-¤±]|[^¤«-¤³]/, '¤¢', 0, 2)
-x(/[¤¤-¤±]|[^¤«-¤³]/, '¤«', 0, 2)
-x(/(?:¤¢|[¤¦-¤])|¤¤¤ò/, '¤¦¤ò', 0, 2)
-x(/(?:¤¢|[¤¦-¤])|¤¤¤ò/, '¤¤¤ò', 0, 4)
-x(/¤¢¤¤¤¦|(?=¤±¤±)..¤Û/, '¤±¤±¤Û', 0, 6)
-x(/¤¢¤¤¤¦|(?!¤±¤±)..¤Û/, '¤¢¤¤¤Û', 0, 6)
-x(/(?=¤ò¤¢)..¤¢|(?=¤ò¤ò)..¤¢/, '¤ò¤ò¤¢', 0, 6)
-x(/(?<=¤¢|¤¤¤¦)¤¤/, '¤¤¤¦¤¤', 4, 6)
-n(/(?>¤¢|¤¢¤¤¤¨)¤¦/, '¤¢¤¤¤¨¤¦')
-x(/(?>¤¢¤¤¤¨|¤¢)¤¦/, '¤¢¤¤¤¨¤¦', 0, 8)
-x(/¤¢?|¤¤/, '¤¢', 0, 2)
-x(/¤¢?|¤¤/, '¤¤', 0, 0)
-x(/¤¢?|¤¤/, '', 0, 0)
-x(/¤¢*|¤¤/, '¤¢¤¢', 0, 4)
-x(/¤¢*|¤¤*/, '¤¤¤¢', 0, 0)
-x(/¤¢*|¤¤*/, '¤¢¤¤', 0, 2)
-x(/[a¤¢]*|¤¤*/, 'a¤¢¤¤¤¤¤¤', 0, 3)
-x(/¤¢+|¤¤*/, '', 0, 0)
-x(/¤¢+|¤¤*/, '¤¤¤¤¤¤', 0, 6)
-x(/¤¢+|¤¤*/, '¤¢¤¤¤¤¤¤', 0, 2)
-x(/¤¢+|¤¤*/, 'a¤¢¤¤¤¤¤¤', 0, 0)
-n(/¤¢+|¤¤+/, '')
-x(/(¤¢|¤¤)?/, '¤¤', 0, 2)
-x(/(¤¢|¤¤)*/, '¤¤¤¢', 0, 4)
-x(/(¤¢|¤¤)+/, '¤¤¤¢¤¤', 0, 6)
-x(/(¤¢¤¤|¤¦¤¢)+/, '¤¦¤¢¤¢¤¤¤¦¤¨', 0, 8)
-x(/(¤¢¤¤|¤¦¤¨)+/, '¤¦¤¢¤¢¤¤¤¦¤¨', 4, 12)
-x(/(¤¢¤¤|¤¦¤¢)+/, '¤¢¤¢¤¤¤¦¤¢', 2, 10)
-x(/(¤¢¤¤|¤¦¤¢)+/, '¤¢¤¤¤ò¤¦¤¢', 0, 4)
-x(/(¤¢¤¤|¤¦¤¢)+/, '$$zzzz¤¢¤¤¤ò¤¦¤¢', 6, 10)
-x(/(¤¢|¤¤¤¢¤¤)+/, '¤¢¤¤¤¢¤¤¤¢', 0, 10)
-x(/(¤¢|¤¤¤¢¤¤)+/, '¤¤¤¢', 2, 4)
-x(/(¤¢|¤¤¤¢¤¤)+/, '¤¤¤¢¤¢¤¢¤¤¤¢', 2, 8)
-x(/(?:¤¢|¤¤)(?:¤¢|¤¤)/, '¤¢¤¤', 0, 4)
-x(/(?:¤¢*|¤¤*)(?:¤¢*|¤¤*)/, '¤¢¤¢¤¢¤¤¤¤¤¤', 0, 6)
-x(/(?:¤¢*|¤¤*)(?:¤¢+|¤¤+)/, '¤¢¤¢¤¢¤¤¤¤¤¤', 0, 12)
-x(/(?:¤¢+|¤¤+){2}/, '¤¢¤¢¤¢¤¤¤¤¤¤', 0, 12)
-x(/(?:¤¢+|¤¤+){1,2}/, '¤¢¤¢¤¢¤¤¤¤¤¤', 0, 12)
-x(/(?:¤¢+|\A¤¤*)¤¦¤¦/, '¤¦¤¦', 0, 4)
-n(/(?:¤¢+|\A¤¤*)¤¦¤¦/, '¤¢¤¤¤¦¤¦')
-x(/(?:^¤¢+|¤¤+)*¤¦/, '¤¢¤¢¤¤¤¤¤¤¤¢¤¤¤¦', 12, 16)
-x(/(?:^¤¢+|¤¤+)*¤¦/, '¤¢¤¢¤¤¤¤¤¤¤¤¤¦', 0, 14)
-x(/¤¦{0,}/, '¤¦¤¦¤¦¤¦', 0, 8)
-x(/¤¢|(?i)c/, 'C', 0, 1)
-x(/(?i)c|¤¢/, 'C', 0, 1)
-x(/(?i:¤¢)|a/, 'a', 0, 1)
-n(/(?i:¤¢)|a/, 'A')
-x(/[¤¢¤¤¤¦]?/, '¤¢¤¤¤¦', 0, 2)
-x(/[¤¢¤¤¤¦]*/, '¤¢¤¤¤¦', 0, 6)
-x(/[^¤¢¤¤¤¦]*/, '¤¢¤¤¤¦', 0, 0)
-n(/[^¤¢¤¤¤¦]+/, '¤¢¤¤¤¦')
-x(/¤¢??/, '¤¢¤¢¤¢', 0, 0)
-x(/¤¤¤¢??¤¤/, '¤¤¤¢¤¤', 0, 6)
-x(/¤¢*?/, '¤¢¤¢¤¢', 0, 0)
-x(/¤¤¤¢*?/, '¤¤¤¢¤¢', 0, 2)
-x(/¤¤¤¢*?¤¤/, '¤¤¤¢¤¢¤¤', 0, 8)
-x(/¤¢+?/, '¤¢¤¢¤¢', 0, 2)
-x(/¤¤¤¢+?/, '¤¤¤¢¤¢', 0, 4)
-x(/¤¤¤¢+?¤¤/, '¤¤¤¢¤¢¤¤', 0, 8)
-x(/(?:ŷ?)??/, 'ŷ', 0, 0)
-x(/(?:ŷ??)?/, 'ŷ', 0, 0)
-x(/(?:̴?)+?/, '̴̴̴', 0, 2)
-x(/(?:É÷+)??/, 'É÷É÷É÷', 0, 0)
-x(/(?:Àã+)??Áú/, 'ÀãÀãÀãÁú', 0, 8)
-i(/(?:¤¢¤¤)?{2}/, '', 0, 0) # GNU regex bug
-x(/(?:µ´¼Ö)?{2}/, 'µ´¼Öµ´¼Öµ´', 0, 8)
-x(/(?:µ´¼Ö)*{0}/, 'µ´¼Öµ´¼Öµ´', 0, 0)
-x(/(?:µ´¼Ö){3,}/, 'µ´¼Öµ´¼Öµ´¼Öµ´¼Ö', 0, 16)
-n(/(?:µ´¼Ö){3,}/, 'µ´¼Öµ´¼Ö')
-x(/(?:µ´¼Ö){2,4}/, 'µ´¼Öµ´¼Öµ´¼Ö', 0, 12)
-x(/(?:µ´¼Ö){2,4}/, 'µ´¼Öµ´¼Öµ´¼Öµ´¼Öµ´¼Ö', 0, 16)
-x(/(?:µ´¼Ö){2,4}?/, 'µ´¼Öµ´¼Öµ´¼Öµ´¼Öµ´¼Ö', 0, 8)
-x(/(?:µ´¼Ö){,}/, 'µ´¼Ö{,}', 0, 7)
-x(/(?:¤«¤¤¯)+?{2}/, '¤«¤¤¯¤«¤¤¯¤«¤¤¯', 0, 12)
-x(/(²Ð)/, '²Ð', 0, 2, 1)
-x(/(²Ð¿å)/, '²Ð¿å', 0, 4, 1)
-x(/((»þ´Ö))/, '»þ´Ö', 0, 4)
-x(/((É÷¿å))/, 'É÷¿å', 0, 4, 1)
-x(/((ºòÆü))/, 'ºòÆü', 0, 4, 2)
-x(/((((((((((((((((((((ÎÌ»Ò))))))))))))))))))))/, 'ÎÌ»Ò', 0, 4, 20)
-x(/(¤¢¤¤)(¤¦¤¨)/, '¤¢¤¤¤¦¤¨', 0, 4, 1)
-x(/(¤¢¤¤)(¤¦¤¨)/, '¤¢¤¤¤¦¤¨', 4, 8, 2)
-x(/()(¤¢)¤¤¤¦(¤¨¤ª¤«)¤¤¯¤±¤³/, '¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³', 6, 12, 3)
-x(/(()(¤¢)¤¤¤¦(¤¨¤ª¤«)¤¤¯¤±¤³)/, '¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³', 6, 12, 4)
-x(/.*(¥Õ¥©)¥ó¡¦¥Þ(¥ó()¥·¥å¥¿)¥¤¥ó/, '¥Õ¥©¥ó¡¦¥Þ¥ó¥·¥å¥¿¥¤¥ó', 10, 18, 2)
-x(/(^¤¢)/, '¤¢', 0, 2)
-x(/(¤¢)|(¤¢)/, '¤¤¤¢', 2, 4, 1)
-x(/(^¤¢)|(¤¢)/, '¤¤¤¢', 2, 4, 2)
-x(/(¤¢?)/, '¤¢¤¢¤¢', 0, 2, 1)
-x(/(¤Þ*)/, '¤Þ¤Þ¤Þ', 0, 6, 1)
-x(/(¤È*)/, '', 0, 0, 1)
-x(/(¤ë+)/, '¤ë¤ë¤ë¤ë¤ë¤ë¤ë', 0, 14, 1)
-x(/(¤Õ+|¤Ø*)/, '¤Õ¤Õ¤Õ¤Ø¤Ø', 0, 6, 1)
-x(/(¤¢+|¤¤?)/, '¤¤¤¤¤¤¤¢¤¢', 0, 2, 1)
-x(/(¤¢¤¤¤¦)?/, '¤¢¤¤¤¦', 0, 6, 1)
-x(/(¤¢¤¤¤¦)*/, '¤¢¤¤¤¦', 0, 6, 1)
-x(/(¤¢¤¤¤¦)+/, '¤¢¤¤¤¦', 0, 6, 1)
-x(/(¤µ¤·¤¹|¤¢¤¤¤¦)+/, '¤¢¤¤¤¦', 0, 6, 1)
-x(/([¤Ê¤Ë¤Ì][¤«¤¤¯]|¤«¤¤¯)+/, '¤«¤¤¯', 0, 6, 1)
-x(/((?i:¤¢¤¤¤¦))/, '¤¢¤¤¤¦', 0, 6, 1)
-x(/((?m:¤¢.¤¦))/, "¤¢\n¤¦", 0, 5, 1)
-x(/((?=¤¢¤ó)¤¢)/, '¤¢¤ó¤¤', 0, 2, 1)
-x(/¤¢¤¤¤¦|(.¤¢¤¤¤¨)/, '¤ó¤¢¤¤¤¨', 0, 8, 1)
-x(/¤¢*(.)/, '¤¢¤¢¤¢¤¢¤ó', 8, 10, 1)
-x(/¤¢*?(.)/, '¤¢¤¢¤¢¤¢¤ó', 0, 2, 1)
-x(/¤¢*?(¤ó)/, '¤¢¤¢¤¢¤¢¤ó', 8, 10, 1)
-x(/[¤¤¤¦¤¨]¤¢*(.)/, '¤¨¤¢¤¢¤¢¤¢¤ó', 10, 12, 1)
-x(/(\A¤¤¤¤)¤¦¤¦/, '¤¤¤¤¤¦¤¦', 0, 4, 1)
-n(/(\A¤¤¤¤)¤¦¤¦/, '¤ó¤¤¤¤¤¦¤¦')
-x(/(^¤¤¤¤)¤¦¤¦/, '¤¤¤¤¤¦¤¦', 0, 4, 1)
-n(/(^¤¤¤¤)¤¦¤¦/, '¤ó¤¤¤¤¤¦¤¦')
-x(/¤í¤í(¤ë¤ë$)/, '¤í¤í¤ë¤ë', 4, 8, 1)
-n(/¤í¤í(¤ë¤ë$)/, '¤í¤í¤ë¤ë¤ë')
-x(/(̵)\1/, '̵̵', 0, 4)
-n(/(̵)\1/, '̵Éð')
-x(/(¶õ?)\1/, '¶õ¶õ', 0, 4)
-x(/(¶õ??)\1/, '¶õ¶õ', 0, 0)
-x(/(¶õ*)\1/, '¶õ¶õ¶õ¶õ¶õ', 0, 8)
-x(/(¶õ*)\1/, '¶õ¶õ¶õ¶õ¶õ', 0, 4, 1)
-x(/¤¢(¤¤*)\1/, '¤¢¤¤¤¤¤¤¤¤', 0, 10)
-x(/¤¢(¤¤*)\1/, '¤¢¤¤', 0, 2)
-x(/(¤¢*)(¤¤*)\1\2/, '¤¢¤¢¤¢¤¤¤¤¤¢¤¢¤¢¤¤¤¤', 0, 20)
-x(/(¤¢*)(¤¤*)\2/, '¤¢¤¢¤¢¤¤¤¤¤¤¤¤', 0, 14)
-x(/(¤¢*)(¤¤*)\2/, '¤¢¤¢¤¢¤¤¤¤¤¤¤¤', 6, 10, 2)
-x(/(((((((¤Ý*)¤Ú))))))¤Ô\7/, '¤Ý¤Ý¤Ý¤Ú¤Ô¤Ý¤Ý¤Ý', 0, 16)
-x(/(((((((¤Ý*)¤Ú))))))¤Ô\7/, '¤Ý¤Ý¤Ý¤Ú¤Ô¤Ý¤Ý¤Ý', 0, 6, 7)
-x(/(¤Ï)(¤Ò)(¤Õ)\2\1\3/, '¤Ï¤Ò¤Õ¤Ò¤Ï¤Õ', 0, 12)
-x(/([¤-¤±])\1/, '¤¯¤¯', 0, 4)
-x(/(\w\d\s)\1/, '¤¢5 ¤¢5 ', 0, 8)
-n(/(\w\d\s)\1/, '¤¢5 ¤¢5')
-x(/(ï¡©|[¤¢-¤¦]{3})\1/, 'ï¡©', 0, 8)
-x(/...(ï¡©|[¤¢-¤¦]{3})\1/, '¤¢a¤¢Ã¯¡©Ã¯¡©', 0, 13)
-x(/(ï¡©|[¤¢-¤¦]{3})\1/, '¤¦¤¤¤¦¤¦¤¤¤¦', 0, 12)
-x(/(^¤³)\1/, '¤³¤³', 0, 4)
-n(/(^¤à)\1/, '¤á¤à¤à')
-n(/(¤¢$)\1/, '¤¢¤¢')
-n(/(¤¢¤¤\Z)\1/, '¤¢¤¤')
-x(/(¤¢*\Z)\1/, '¤¢', 2, 2)
-x(/.(¤¢*\Z)\1/, '¤¤¤¢', 2, 4)
-x(/(.(¤ä¤¤¤æ)\2)/, 'z¤ä¤¤¤æ¤ä¤¤¤æ', 0, 13, 1)
-x(/(.(..\d.)\2)/, '¤¢12341234', 0, 10, 1)
-x(/((?i:¤¢v¤º))\1/, '¤¢v¤º¤¢v¤º', 0, 10)
-x(/(?<¶ò¤«>ÊÑ|\(\g<¶ò¤«>\))/, '((((((ÊÑ))))))', 0, 14)
-x(/\A(?:\g<°¤-1>|\g<±¾-2>|\z½ªÎ» (?<°¤-1>´Ñ|¼«\g<±¾-2>¼«)(?<±¾-2>ºß|Êî»§\g<°¤-1>Êî»§))$/, 'Êî»§¼«Êî»§¼«ºß¼«Êî»§¼«Êî»§', 0, 26)
-x(/[[¤Ò¤Õ]]/, '¤Õ', 0, 2)
-x(/[[¤¤¤ª¤¦]¤«]/, '¤«', 0, 2)
-n(/[[^¤¢]]/, '¤¢')
-n(/[^[¤¢]]/, '¤¢')
-x(/[^[^¤¢]]/, '¤¢', 0, 2)
-x(/[[¤«¤¤¯]&&¤¤¯]/, '¤¯', 0, 2)
-n(/[[¤«¤¤¯]&&¤¤¯]/, '¤«')
-n(/[[¤«¤¤¯]&&¤¤¯]/, '¤±')
-x(/[¤¢-¤ó&&¤¤-¤ò&&¤¦-¤ñ]/, '¤ñ', 0, 2)
-n(/[^¤¢-¤ó&&¤¤-¤ò&&¤¦-¤ñ]/, '¤ñ')
-x(/[[^¤¢&&¤¢]&&¤¢-¤ó]/, '¤¤', 0, 2)
-n(/[[^¤¢&&¤¢]&&¤¢-¤ó]/, '¤¢')
-x(/[[^¤¢-¤ó&&¤¤¤¦¤¨¤ª]&&[^¤¦-¤«]]/, '¤', 0, 2)
-n(/[[^¤¢-¤ó&&¤¤¤¦¤¨¤ª]&&[^¤¦-¤«]]/, '¤¤')
-x(/[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]/, '¤¦', 0, 2)
-x(/[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]/, '¤¨', 0, 2)
-n(/[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]/, '¤«')
-x(/[¤¢-&&-¤¢]/, '-', 0, 1)
-x(/[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]q-w]/, '¤¨', 0, 2)
-x(/[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]/, 'f', 0, 1)
-x(/[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]/, 'g', 0, 1)
-n(/[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]/, '2')
-r(/¤¢/, '¤¢', 0)
-r(/¤¢/, '¤¢', 0, 2)
-r(/¤¤/, '¤¢¤¤¤¦', 2)
-r(/¤¤/, '¤¢¤¤¤¦', 2, 4)
-r(/./, '¤¢', 0)
-r(/.*/, '¤¢¤¤¤¦¤¨¤ª ¤«¤¤¯', 17)
-r(/.*¤¨¤ª/, '¤¢¤¤¤¦¤¨¤ª ¤«¤¤¯', 6)
-r(/¤¢*/, '¤¢¤¢¤¢¤¤¤¤¤¦', 12)
-r(/¤¢+/, '¤¢¤¢¤¢¤¤¤¤¤¦', 4)
-r(/¤¢?/, '¤¤¤¢¤¦', 6)
-r(/Á´??/, 'ÉéÁ´ÊÑ', 6)
-r(/aÊÕc´Áe/, 'aÊÕc´Áeavcd', 0)
-r(/\w\d\s/, ' ¤¢2 ¤¦¤¦ $3 ', 2)
-r(/[¤¦-¤ª]¤¢¤¢[¤È-¤ó]/, '3¤¦¤¢¤¢¤Ê¤¦¤¢¤¢¤¢', 1)
-r(/¤¢|¤¤/, '¤¤', 0)
-r(/¤¢¤¤|¤¤¤¦|¤¦¤¨/, '¤¤¤¦¤¦', 0)
-r(/(¤È¤È¤Á)\1/, '¤È¤È¤Á¤È¤È¤Á¤È¤È¤Á', 6)
-r(/|¤¨/, '¤¨', 2)
-r(/^¤¢¤º/, '¤¢¤º¤¢¤º', 0)
-r(/¤¢¤º$/, '¤¢¤º¤¢¤º', 4)
-r(/(((.¤¢)))\3/, 'z¤¢z¤¢¤¢¤¢', 0)
-r(/(¤¢¤¦*?¤ó)\1/, '¤¢¤¢¤¦¤¦¤ó¤¢¤¦¤¦¤ó¤¢¤¦¤ó', 2)
-r(/¤¢¤¢¤ó{3,4}/, '¤Æ¤Æ¤¢¤¢¤¤¤¤¤¢¤¢¤ó¤ó¤ó¤¢¤¢¤ó¤¢¤¢¤ó', 12)
-r(/\000¤¢/, "¤¤\000¤¢", 2)
-r(/¤È¤È\xfe\xfe/, "¤È¤È¤È\xfe\xfe", 2)
-r(/...¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³¤µ¤·¤¹¤»¤½/, 'zzzzz¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³¤µ¤·¤¹¤»¤½', 2)
-end
-
-test_sb('ASCII')
-test_sb('EUC')
-test_sb('SJIS')
-test_sb('UTF8')
-test_euc('EUC')
-
-
-# UTF-8 (by UENO Katsuhiro)
-$KCODE = 'UTF-8'
-
-s = "\xe3\x81\x82\xe3\x81\x81\xf0\x90\x80\x85\xe3\x81\x8a\xe3\x81\x85"
-x(/[\xc2\x80-\xed\x9f\xbf]+/u, s, 0, 6)
-
-s = "\xf0\x90\x80\x85\xe3\x81\x82"
-x(/[\xc2\x80-\xed\x9f\xbf]/u, s, 4, 7)
-
-s = "\xed\x9f\xbf"
-n(/[\xc2\x80-\xed\x9f\xbe]/u, s)
-
-s = "\xed\x9f\xbf"
-n(/[\xc2\x80-\xed\x9f\xbe]/u, s)
-
-s = "\xed\x9f\xbf"
-n(/[\xc2\x80-\xed\x9f\xbe]/u, s)
-
-s = "\xed\x9f\xbf"
-n(/[\xc3\xad\xed\x9f\xbe]/u, s)
-
-s = "\xed\x9f\xbf"
-n(/[\xc4\x80-\xed\x9f\xbe]/u, s)
-
-s = "\xed\x9f\xbf\xf0\x90\x80\x85\xed\x9f\xbf"
-x(/[^\xc2\x80-\xed\x9f\xbe]/u, s, 0, 3)
-
-s = "\xed\x9f\xbf"
-x(/[^\xc3\xad\xed\x9f\xbe]/u, s, 0, 3)
-
-s = "\xed\x9f\xbf\xf0\x90\x80\x85\xed\x9f\xbf"
-x(/[^\xc4\x80-\xed\x9f\xbe]/u, s, 0, 3)
-
-s = "\xc3\xbe\xc3\xbf"
-n(/[\xfe\xff\xc3\x80]/u, s)
-
-
-# Japanese long text.
-$KCODE = 'EUC'
-
-s = <<EOS
-Àï¸å¤ÎÆüËܤˤª¤¤¤Æ¤Ï¡¢µì·³¤Ë¤Ä¤¤¤Æ¤ÏÄ´ºº¤Ë´ð¤Å¤«¤ÌÈãȽ¤âµö¤µ¤ì¤ëÉ÷Ĭ¤âÀ¸¤¸¡¢
-¤¿¤È¤¨¤Ð»°½½È¬Ç¯¼°Êâʼ½Æ¤ÎÀ©Äêǯ¤¬ÆüϪÀïÁè¤Î½ª¤Ã¤¿Ç¯¤Ç¤¢¤ë¤³¤È¤ò¤â¤Ã¤Æ·Ú¹ú¤Ë
-µì·³¤Îµì¼°¤Ö¤ê¤ò¸ØÄ¥¤¹¤ëÏÀɾ¤¬¤Þ¤«¤ê¤È¤ª¤Ã¤Æ¤¤¤ë¡£
-Í̾¤ÊÏÀ¼Ô¤È¤·¤Æ¤Ï¡¢¸Î¡¦»ÊÇÏÎËÂÀϺ¤òµó¤²¤ë¤³¤È¤¬¤Ç¤¤ë¤À¤í¤¦¡£
-
-ʼƣÆó½½È¬ ¡ÖÍºä½Æ¡× »Íë¥é¥¦¥ó¥É (1998)
-EOS
-
-x(/\((.+)\)/, s, 305, 309, 1)
-x(/»ÊÇÏÎËÂÀϺ/, s, 229, 239)
-x(/¡£$/, s, 202, 204)
-x(/(^ʼƣ..Ȭ)/, s, 269, 279, 1)
-x(/^$/, s, 268, 268)
-
-
-s = <<EOS
-¥«¥Ê¤ä¥í¡¼¥Þ»ú¤Ï°ìÂÎʸ»ú¤Ç¤¢¤í¤¦¤«¡£
-¤â¤·¤³¤È¤Ð¤ò¤·¤ë¤¹¤â¤Î¤¬Ê¸»ú¤Ç¤¢¤ë¤È¤¹¤ë¤È¡¢¤½¤ì¤Ï¤³¤È¤Ð¤ò¤·¤ë¤¹¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
-Ëܤäbook¤Ï¤³¤È¤Ð¤Ç¤¢¤ë¤¬¡¢¥Û¥ó¤ähon¤Ï²»¤ò¤Ê¤é¤Ù¤¿¤À¤±¤Ç¡¢½½Ê¬¤Êñ¸ìÀ¤ò
-¤â¤Ä¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
-ñ¸ì¤È¤·¤Æ¤ÎÆÃÄê¤Î·ÁÂÖ¤ò¤â¤¿¤Ê¤¤¤«¤é¤Ç¤¢¤ë¡£
-¡Ö·Á¤Ë¤è¤ë¸ì¡×¤ò¥¢¥é¥ó¤Ï´Á»ú¤ËÂФ¹¤ë·ÚÊÎŪ¤Ê°ÕÌ£¤ËÍѤ¤¤¿¤¬¡¢
-·Á¤Î¤Ê¤¤¤â¤Î¤ÏËÜÅö¤Ï¸ì¤Ç¤Ï¤¢¤ê¤¨¤Ê¤¤¤Î¤Ç¤¢¤ë¡£
-
-ÇòÀîÀÅ ¡Ö´Á»úÉ´Ïá×
-EOS
-
-n(/\((.+)\)/, s)
-x(/¡Ö(.*)¡×/, s, 254, 264, 1)
-x(/¡£$/, s, 34, 36)
-x(/(book)/, s, 120, 124, 1)
-x(/^$/, s, 360, 360)
-
-
-s = <<EOS
-¼á²à¤¬±Ã»³¤Ë¤¯¤À¤Ã¤Æ¤¤¿¤È¤¹¤ì¤Ð¡¢¤½¤Î¤ª¤Ó¤¿¤À¤·¤¤Ì©¶µÈþ½Ñ¤ÎÎ̤ȡ¢
-¤½¤Î¼Á¤Î¹â¤µ¤Ë¤ª¤É¤í¤¯¤Ë¤Á¤¬¤¤¤Ê¤¤¡£
-¤³¤Î³Ð¼Ô¤¬¡¢°µÅÝŪ¤Ê¶Ã¤¤ò¤â¤Ä¤Î¤Ï¡¢¤ªÉÔÆ°¤µ¤ó¤ÎÁü¤ÎÁ°¤ËΩ¤Ã¤¿¤È¤¤À¤í¤¦¡£
-¡Ý¡Ý ¤³¤ì¤Ï¡¢¥É¥é¥ô¥£¥À¿Í¤Î¾¯Ç¯ÅÛÎì¤Ç¤Ï¤Ê¤¤¤«¡£
-
-»ÊÇÏÎËÂÀϺ ¡Ö±Ã»³Èþ½Ñ¤ÎŸ³«¡ÝÉÔÆ°ÌÀ²¦¤Ë¤Õ¤ì¤Ä¤Ä¡× ¥¢¥µ¥Ò¥°¥é¥Õ(1986)
-EOS
-
-x(/\((.+)\)/, s, 290, 296)
-x(/¡Ö(.*)¡Ý(.+)¡×/, s, 257, 275, 2)
-x(/^¡Ý¡Ý /, s, 179, 184)
-x(/(¼á²à)/, s, 0, 4, 1)
-x(/\w¡¢/, s, 30, 34)
-
-
-s = <<EOS
-¤«¤È¤¤¤Ã¤Æ¡¢½êÁ§¤Ï¡¢»ûÆâ·¯¤â¡¢¹õ´ä·¯¤â¡¢¤½¤·¤Æ¤â¤¦°ì¿Í¤Î¿Íʪ¤â¡¢¸ýÀå¤ÎÅ̤ˤ¹¤®¤Ê¤¤¤³¤È¤ò¡¢¤³¤ÎÂè¼·¹æ¤ÏÇ¡¼Â¤Ëʪ¸ì¤Ã¤Æ¤¤¤ë¡£
-¤«¤ì¤é»°¿Í¤Î¾®Àâ¤Ï°ì¹Ô¤â½Ð¤Æ¤¤¤Ê¤¤¤Î¤À¡£
-½ñ¤¯¤Ò¤Þ¤¬¤Ê¤«¤Ã¤¿¤Î¤Ç¤¢¤í¤¦¡£
-¤·¤«¤·¡¢»¨»ï¡Ö¶áÂåÀâÏáפ¬¡¢¤Ê¤ªÂèȬ¹æ¤âÂè¶å¹æ¤â½Ð¤Ä¤Å¤±¤Æ¤æ¤¯¤Ç¤¢¤í¤¦¤³¤È¤Ë¤Ä¤¤¤Æ¤Ï¡¢»ä¤Ï¤Ö¤¤ß¤Ê¤Û¤É¤Î³Î¿®¤ò¤â¤Ã¤Æ¤¤¤ë¡£¤³¤Î»¨»ï¤Ë¤Ï¡¢»ö̳ǽÎϤÎËâʪ¤Î¤è¤¦¤Ê¿Íʪ¤¬¡¢»°¿Í¤â¤¤¤ë¡£
-¤½¤ì¤ò»×¤¦¤È¡¢¤È¤¤É¤¤¿¤á©¤Î½Ð¤ë¤è¤¦¤Ê¤ª¤â¤¤¤¬¤¹¤ë¤Î¤Ç¤¢¤ë¡£
-
-»ÊÇÏÎËÂÀϺ ¡Ö¤³¤ó¤Ê»¨»ï¤ä¤á¤Æ¤·¤Þ¤¤¤¿¤¤¡× ¶áÂåÀâÏà Âè¼·½¸ (1961)
-EOS
-
-x(/\((\d+)\)/, s, 496, 502)
-x(/(¡Ö.+»¨»ï.*¡×)/, s, 449, 479, 1)
-x(/Âè(.)¹æ/, s, 96, 98, 1)
-x(/¡£$/, s, 120, 122)
-x(/¶áÂåÀâÏÃ/, s, 209, 217)
-
-
-s = <<EOS
-Æó½½¸ÞÇܤò±Û¤¨¤ëÇüÂç¤ÊÎ̤β¼¤ê±ö¤ËÂй³¤¹¤ë¼êΩ¤Æ¤Ë¿´¤Å¤â¤ê¤¬¤¢¤Ã¤¿¤Î¤Ï¡¢À¸¤»Ä¤Ã¤Æ¤¤¤¿»Í½½¸®¤ÎÃϲö¤ê±öÌä²°¤Î¤¦¤Á°ËÀª²°¤ÎÇò°°Ëʼ±Ò¤¿¤À°ì¿Í¤À¤Ã¤¿¡£
-°ì¸ý¤ËÃϲö¤ê±ö¤È¤¤¤Ã¤Æ¤â¡¢¹¾¸Í¾ë¸æ¿ô´ó²°¤ËǼÆþ¤¹¤ë¸æÍѱö¤È¡¢¹¾¸Í»ÔÃæ¤Ëή¤¹¤â¤Î¤È¤ÏÅöÁ³Æ±¤¸Êª¤Ç¤Ï¤Ê¤«¤Ã¤¿¡£
-¤½¤â¤½¤â¤¬Àïʪ»ñ¤òÁ°Äó¤È¤·¤Æ¹Í¤¨¤é¤ì¤¿¹ÔÆÁ±ö¤Ï¡¢Í¢Á÷¤¹¤ëÀޤ˶ì½Áʬ¤¬ÍϤ±¤À¤·Ìܸº¤ê¤·¤¿¤Î¤Ç¤ÏÏäˤʤé¤Ê¤¤¡£¤½¤³¤Ç¡¢¹¾¸Í¾ë¤ËǼ¤á¤ë¤â¤Î¤Ï¡¢¾Æ¤¤¢¤²¤¿±ö¤ò°ì²Æ°±Îü°Ï¤¤¤Ë¤·¤¿¾®²°¤ËÀѤ߾夲¡¢¶ì½Áʬ¤òÈ´¤¤¤Æ¿¿±ö¤Ë»ÅΩ¤Æ¾å¤²¤¿¤â¤Î¤À¤Ã¤¿¡£
-
-ÈÓÅèÏÂ°ì ¡Ö»ÏÁÄÄ»µ¡× (2000)
-EOS
-
-x(/\((\d+)\)/, s, 506, 512)
-x(/(¡Ö.*¡×)/, s, 493, 505, 1)
-x(/¹ÔÆÁ±ö/, s, 292, 298)
-
-
-s = <<EOS
-¤³¤¦¤·¤¿ÆüËܿͤÎÉð´ï¤ËÂФ¹¤ëÊѤï¤Ã¤¿ÂÖÅÙ¤Î΢¤Ë¤Ï¡¢¤¸¤Ä¤Ï¡¢
-°ì´Ó¤·¤¿ÁªÂò´ð½à¤¬Æ¯¤¤¤Æ¤¤¤¿¡£
-¤½¤ì¤Ï¡¢¤½¤ÎÉð´ï¤¬¡Ö¼çʼ¤ò¹âµé¤Ë¸«¤»¤ë¤«¤É¤¦¤«¡×¤Ç¤¢¤Ã¤¿¡£
-
-ʼƣÆó½½È¬ ¡ÖÍºä½Æ¡× »Íë¥é¥¦¥ó¥É (1998)
-EOS
-
-x(/\((\d+)\)/, s, 185, 191)
-x(/(¡Ö.*¡×)/, s, 108, 138, 1)
-x(/^¤½¤ì¤Ï/, s, 90, 96)
-x(/^.*$/, s, 0, 58)
-
-s = <<EOS
- É£¤Ï¿Í¤â¿©¤¤¡¢ÇϤλôÎÁ¤Ë¤â¤·¤Þ¤·¤¿¡£ÇϤˤÏÉ£°ì¾£¤ËƦÆó¹ç¤ò¤¿¤¤¤Æ¤Þ¤¼¤¿¤â¤Î¤ò°ìÆü¤Ë°ì²ó¤Ï¤¿¤Ù¤µ¤»¤¿¡£¿Í´Ö¤è¤ê¤Ï¾åÅù¤Î¤â¤Î¤ò¤¿¤Ù¤µ¤»¤¿¤â¤ó¤Ç¤¢¤ê¤Þ¤¹¡£
- ¿Í´Ö¤ÏÆüº¢¤Ï¥Ø¥º¥êÈÓ¤ò¤¿¤Ù¤¿¡£´¥ºÚ¤ò¤æ¤Ç¤Æ¡¢¤æ¤Ç¤¸¤ë¤òÇϤˤä¤ê¡¢ºÚ¤ò¤³¤Þ¤«¤ËÀڤꡢºÚ¤ÈÉ£¤ÈÊÆ¤ò¤Þ¤¼¤Æ¤¿¤¤¤Æ¤¿¤Ù¤¿¡£¤º¤Ã¤ÈÀΤÏÊÆ¤ÈÉ£¤¬È¾¡¹¤°¤é¤¤¤Ç¤¢¤Ã¤¿¤¬¡¢ÌÀ¼£¤âÆó½½Ç¯Âå¤Ë¤Ê¤ë¤È¡¢É£¤ò¤Ä¤¯¤ë¤Î¤¬¤Ø¤Ã¤ÆÍè¤Æ¡¢É£¤ÏÊÆ¤Î»°Ê¬¤Î°ì¤¯¤é¤¤¤Ë¤Ê¤Ã¤¿¡£¥Ø¥º¥êÈӤˤϱö¤ò¾¯¤·¤¤¤ì¤¿¤â¤ó¤Ç¤¹¡£
-
-µÜËܾï°ì ¡Ö˺¤ì¤é¤ì¤¿ÆüËÜ¿Í¡× (1960)
-EOS
-
-x(/(É£¤ÏÊÆ¤Î»°Ê¬¤Î°ì¤¯¤é¤¤¤Ë)/, s, 357, 381, 1)
-x(/¤¢¤ê¤Þ¤¹¡£$/, s, 140, 150)
-x(/ ¿Í´Ö(.*)¡£/, s, 157, 423, 1)
-x(/¥Ø¥º¥êÈÓ[¤ò¤Ï¤Ç]/, s, 165, 175)
-
-s = <<EOS
-¿È¤Ï¤¿¤È¤Ò Éð¢¤ÎÌîÊդ˵à¤Ì¤È¤â αÃÖ¤Þ¤·ÂçϺ²
-
-µÈÅľ¾°þ ¡Öαº²Ï¿¡× (1859)
-EOS
-
-x(/\((.+)\)/, s, 68, 74)
-x(/¡Ö(.*)¡×/, s, 59, 65, 1)
-x(/^(µÈÅľ¾°þ)/, s, 48, 56, 1)
-
-
-# result
-printf("\n*** Result SUCCESS: %d, FAIL: %d ***\n", $rok, $rfail)
-
-# END.
#include "oniguruma.h"
#endif
-static int nsucc = 0;
-static int nfail = 0;
+static int nsucc = 0;
+static int nfail = 0;
+static int nerror = 0;
+
+static FILE* err_file;
#ifndef POSIX_TEST
-static RegRegion* region;
+static OnigRegion* region;
#endif
static void xx(char* pattern, char* str, int from, int to, int mem, int not)
r = regcomp(®, pattern, REG_EXTENDED | REG_NEWLINE);
if (r) {
regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
+ fprintf(err_file, "ERROR: %s\n", buf);
+ nerror++;
+ return ;
}
r = regexec(®, str, reg.re_nsub + 1, pmatch, 0);
if (r != 0 && r != REG_NOMATCH) {
regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\n", buf);
- exit(-1);
+ fprintf(err_file, "ERROR: %s\n", buf);
+ nerror++;
+ return ;
}
if (r == REG_NOMATCH) {
#else
regex_t* reg;
- RegErrorInfo einfo;
+ OnigErrorInfo einfo;
- r = regex_new(®, (UChar* )pattern, (UChar* )(pattern + strlen(pattern)),
- REG_OPTION_DEFAULT, REGCODE_SJIS, REG_SYNTAX_DEFAULT, &einfo);
+ r = onig_new(®, (UChar* )pattern, (UChar* )(pattern + strlen(pattern)),
+ ONIG_OPTION_DEFAULT, ONIG_ENCODING_EUC_JP, ONIG_SYNTAX_DEFAULT, &einfo);
if (r) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r, &einfo);
- fprintf(stderr, "ERROR: %s\n", s);
- exit(-1);
+ char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str(s, r, &einfo);
+ fprintf(err_file, "ERROR: %s\n", s);
+ nerror++;
+ return ;
}
- r = regex_search(reg, (UChar* )str, (UChar* )(str + strlen(str)),
- (UChar* )str, (UChar* )(str + strlen(str)),
- region, REG_OPTION_NONE);
- if (r < REG_MISMATCH) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r);
- fprintf(stderr, "ERROR: %s\n", s);
- exit(-1);
+ r = onig_search(reg, (UChar* )str, (UChar* )(str + strlen(str)),
+ (UChar* )str, (UChar* )(str + strlen(str)),
+ region, ONIG_OPTION_NONE);
+ if (r < ONIG_MISMATCH) {
+ char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str(s, r);
+ fprintf(err_file, "ERROR: %s\n", s);
+ nerror++;
+ return ;
}
- if (r == REG_MISMATCH) {
+ if (r == ONIG_MISMATCH) {
if (not) {
fprintf(stdout, "OK(N): /%s/ '%s'\n", pattern, str);
nsucc++;
}
}
}
- regex_free(reg);
+ onig_free(reg);
#endif
}
extern int main(int argc, char* argv[])
{
+ err_file = stdout;
+
#ifdef POSIX_TEST
- reg_set_encoding(REG_ENCODING_SJIS);
+ reg_set_encoding(REG_POSIX_ENCODING_EUC_JP);
#else
- region = regex_region_new();
+ region = onig_region_new();
#endif
x2("", "", 0, 0);
x2("\\x1f", "\x1f", 0, 1);
x2("\\xFE", "\xfe", 0, 1);
x2("a(?#....\\\\JJJJ)b", "ab", 0, 2);
+ x2("(?x) G (o O(?-x)oO) g L", "GoOoOgLe", 0, 7);
x2(".", "a", 0, 1);
n(".", "");
x2("..", "ab", 0, 2);
x2("[^a]", "\n", 0, 1);
x2("[]]", "]", 0, 1);
n("[^]]", "]");
+ x2("[\\^]+", "0^^1", 1, 3);
x2("[b-]", "b", 0, 1);
x2("[b-]", "-", 0, 1);
x2("[\\w]", "z", 0, 1);
n("[\\w]", " ");
+ x2("[\\W]", "b$", 1, 2);
x2("[\\d]", "5", 0, 1);
n("[\\d]", "e");
x2("[\\D]", "t", 0, 1);
n("az\\A", "az");
n("a\\Az", "az");
x2("\\^\\$", "^$", 0, 2);
+ x2("^x?y", "xy", 0, 2);
+ x2("^(x?y)", "xy", 0, 2);
x2("\\w", "_", 0, 1);
n("\\W", "_");
x2("(?=z)z", "z", 0, 1);
x2("(?i:[f-m])", "H", 0, 1);
x2("(?i:[f-m])", "h", 0, 1);
n("(?i:[f-m])", "e");
- n("(?i:[b-C])", "A");
- x2("(?i:[a-C])", "B", 0, 1);
- n("(?i:[c-X])", "[");
- n("(?i:[!-k])", "Z");
+ x2("(?i:[A-c])", "D", 0, 1);
+ x2("(?i:[!-k])", "Z", 0, 1);
x2("(?i:[!-k])", "7", 0, 1);
- n("(?i:[T-}])", "b");
+ x2("(?i:[T-}])", "b", 0, 1);
x2("(?i:[T-}])", "{", 0, 1);
x2("(?i:\\?a)", "?A", 0, 2);
x2("(?i:\\*A)", "*a", 0, 2);
x2("(?m:.)", "\n", 0, 1);
x2("(?m:a.)", "a\n", 0, 2);
x2("(?m:.b)", "a\nb", 1, 3);
+ n("(?i)(?-i)a", "A");
+ n("(?i)(?-i:a)", "A");
x2("a?", "", 0, 0);
x2("a?", "b", 0, 0);
x2("a?", "a", 0, 1);
x2("(?:a+|b+){2}", "aaabbb", 0, 6);
x2("h{0,}", "hhhh", 0, 4);
x2("(?:a+|b+){1,2}", "aaabbb", 0, 6);
+ n("ax{2}*a", "0axxxa1");
+ n("a.{0,2}a", "0aXXXa0");
+ n("a.{0,2}?a", "0aXXXa0");
+ n("a.{0,2}?a", "0aXXXXa0");
x2("(?:a+|\\Ab*)cc", "cc", 0, 2);
n("(?:a+|\\Ab*)cc", "abcc");
x2("(?:^a+|b+)*c", "aabbbabc", 6, 8);
x2("[abc]*", "abc", 0, 3);
x2("[^abc]*", "abc", 0, 0);
n("[^abc]+", "abc");
- x2("a?\?", "aaa", 0, 0);
- x2("ba?\?b", "bab", 0, 3);
+ x2("a??", "aaa", 0, 0);
+ x2("ba??b", "bab", 0, 3);
x2("a*?", "aaa", 0, 0);
x2("ba*?", "baa", 0, 1);
x2("ba*?b", "baab", 0, 4);
x2("a+?", "aaa", 0, 1);
x2("ba+?", "baa", 0, 2);
x2("ba+?b", "baab", 0, 4);
- x2("(?:a?)?\?", "a", 0, 0);
- x2("(?:a?\?)?", "a", 0, 0);
+ x2("(?:a?)??", "a", 0, 0);
+ x2("(?:a??)?", "a", 0, 0);
x2("(?:a?)+?", "aaa", 0, 1);
- x2("(?:a+)?\?", "aaa", 0, 0);
- x2("(?:a+)?\?b", "aaab", 0, 4);
+ x2("(?:a+)??", "aaa", 0, 0);
+ x2("(?:a+)??b", "aaab", 0, 4);
x2("(?:ab)?{2}", "", 0, 0);
x2("(?:ab)?{2}", "ababa", 0, 4);
x2("(?:ab)*{0}", "ababa", 0, 0);
x2("(a)\\1", "aa", 0, 2);
n("(a)\\1", "ab");
x2("(a?)\\1", "aa", 0, 2);
- x2("(a?\?)\\1", "aa", 0, 0);
+ x2("(a??)\\1", "aa", 0, 0);
x2("(a*)\\1", "aaaaa", 0, 4);
x3("(a*)\\1", "aaaaa", 0, 2, 1);
x2("a(b*)\\1", "abbbb", 0, 5);
x2("(?<=a|bc)b", "bcb", 2, 3);
x2("(?<=a|bc)b", "ab", 1, 2);
x2("(?<=a|bc||defghij|klmnopq|r)z", "rz", 1, 2);
+ x2("(a)\\g<1>", "aa", 0, 2);
x2("(?<!a)b", "cb", 1, 2);
n("(?<!a)b", "ab");
x2("(?<!a|bc)b", "bbb", 0, 1);
n("(?<!a|bc)z", "bcz");
x2("(?<name1>a)", "a", 0, 1);
- x2("(?<name-2>ab)\\1", "abab", 0, 4);
- x2("(?<name-3>.zv.)\\k<name-3>", "azvbazvb", 0, 8);
+ x2("(?<name_2>ab)\\g<name_2>", "abab", 0, 4);
+ x2("(?<name_3>.zv.)\\k<name_3>", "azvbazvb", 0, 8);
x2("(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)", "XyZ", 3, 3);
x2("(?<n>|a\\g<n>)+", "", 0, 0);
x2("(?<n>|\\(\\g<n>\\))+$", "()(())", 0, 6);
x2("\\g<n>(abc|df(?<n>.YZ){2,8}){0}", "XYZ", 0, 3);
x2("\\A(?<n>(a\\g<n>)|)\\z", "aaaa", 0, 4);
x2("(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)", "bbbbabba", 0, 8);
- x2("(?<@:name[1240]>\\w+\\sx)a+\\k<@:name[1240]>", " fg xaaaaaaaafg x", 2, 18);
- x3("(z)()()(?<9>a)\\4", "zaa", 1, 2, 4);
- x2("(.)(((?<*>a)))\\k<*>", "zaa", 0, 3);
+ x2("(?<name1240>\\w+\\sx)a+\\k<name1240>", " fg xaaaaaaaafg x", 2, 18);
+ x3("(z)()()(?<_9>a)\\g<_9>", "zaa", 2, 3, 1);
+ x2("(.)(((?<_>a)))\\k<_>", "zaa", 0, 3);
x2("((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)", "ff", 0, 2);
x2("(?:(?<x>)|(?<x>efg))\\k<x>", "", 0, 0);
- x2("(?:(?<@x>abc)|(?<@x>efg))\\k<@x>", "abcefgefg", 3, 9);
- n("(?:(?<@x>abc)|(?<@x>efg))\\k<@x>", "abcefg");
+ x2("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefgefg", 3, 9);
+ n("(?:(?<x>abc)|(?<x>efg))\\k<x>", "abcefg");
x2("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "a-pyumpyum", 2, 10);
x3("(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$", "xxxxabcdefghijklmnabcdefghijklmn", 4, 18, 14);
x3("(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$", "aaa", 0, 3, 16);
x3("(?<foo>a|\\(\\g<foo>\\))", "((((((((a))))))))", 0, 17, 1);
x2("\\g<bar>|\\zEND(?<bar>.*abc$)", "abcxxxabc", 0, 9);
x2("\\g<1>|\\zEND(.a.)", "bac", 0, 3);
- x3("\\g<2>\\g<1>|\\zEND(.a.)(?<?>.b.)", "xbxyay", 3, 6, 1);
+ x3("\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)", "xbxyby", 3, 6, 1);
x2("\\A(?:\\g<pon>|\\g<pan>|\\zEND (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$", "cdcbcdc", 0, 7);
x2("\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)", "aaaa", 0, 4);
x2("(?<n>(a|b\\g<n>c){3,5})", "baaaaca", 1, 5);
x2("(?<n>(a|b\\g<n>c){3,5})", "baaaacaaaaa", 0, 10);
- x2("", "\82 ", 0, 0);
- x2("\82 ", "\82 ", 0, 2);
- n("\82¢", "\82 ");
- x2("\82¤\82¤", "\82¤\82¤", 0, 4);
- x2("\82 \82¢\82¤", "\82 \82¢\82¤", 0, 6);
- x2("\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±", "\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±\82±", 0, 70);
- x2("\82 ", "\82¢\82 ", 2, 4);
- x2("\82¢\82¤", "\82 \82¢\82¤", 2, 6);
+ x2("()*\\1", "", 0, 0);
+ x2("(?:()|())*\\1\\2", "", 0, 0);
+ x3("(?:\\1a|())*", "a", 0, 0, 1);
+ x2("x((.)*)*x", "0x1x2x3", 1, 6);
+ x2("x((.)*)*x(?i:\\1)\\Z", "0x1x2x1X2", 1, 9);
+ x2("(?:()|()|()|()|()|())*\\2\\5", "", 0, 0);
+ x2("(?:()|()|()|(x)|()|())*\\2b\\5", "b", 0, 1);
+ x2("", "¤¢", 0, 0);
+ x2("¤¢", "¤¢", 0, 2);
+ n("¤¤", "¤¢");
+ x2("¤¦¤¦", "¤¦¤¦", 0, 4);
+ x2("¤¢¤¤¤¦", "¤¢¤¤¤¦", 0, 6);
+ x2("¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³", "¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³¤³", 0, 70);
+ x2("¤¢", "¤¤¤¢", 2, 4);
+ x2("¤¤¤¦", "¤¢¤¤¤¦", 2, 6);
x2("\\xca\\xb8", "\xca\xb8", 0, 2);
- x2(".", "\82 ", 0, 2);
- x2("..", "\82©\82«", 0, 4);
- x2("\\w", "\82¨", 0, 2);
- n("\\W", "\82 ");
- x2("\\S", "\82»", 0, 2);
- x2("\\S", "\8a¿", 0, 2);
- x2("\\b", "\8bC ", 0, 0);
- x2("\\b", " \82Ù", 1, 1);
- x2("\\B", "\82¹\82» ", 2, 2);
- x2("\\B", "\82¤ ", 3, 3);
- x2("\\B", " \82¢", 0, 0);
- x2("[\82½\82¿]", "\82¿", 0, 2);
- n("[\82È\82É]", "\82Ê");
- x2("[\82¤-\82¨]", "\82¦", 0, 2);
- n("[^\82¯]", "\82¯");
- x2("[\\w]", "\82Ë", 0, 2);
- n("[\\d]", "\82Ó");
- x2("[\\D]", "\82Í", 0, 2);
- n("[\\s]", "\82");
- x2("[\\S]", "\82Ö", 0, 2);
- x2("[\\w\\d]", "\82æ", 0, 2);
- x2("[\\w\\d]", " \82æ", 3, 5);
- n("\\w\8bS\8eÔ", " \8bS\8eÔ");
- x2("\8bS\\W\8eÔ", "\8bS \8eÔ", 0, 5);
- x2("\82 .\82¢.\82¤", "\82 \82 \82¢\82¢\82¤", 0, 10);
- x2(".\\w\82¤\\W..\82¼", "\82¦\82¤\82¤ \82¤\82¼\82¼", 0, 13);
- x2("\\s\\w\82±\82±\82±", " \82±\82±\82±\82±", 0, 9);
- x2("\82 \82 .\82¯", "\82 \82 \82¯\82¯", 0, 8);
- n(".\82¢", "\82¢\82¦");
- x2(".\82¨", "\82¨\82¨", 0, 4);
- x2("^\82 ", "\82 ", 0, 2);
- x2("^\82Þ$", "\82Þ", 0, 2);
- x2("^\\w$", "\82É", 0, 2);
- x2("^\\w\82©\82«\82\82¯\82±$", "z\82©\82«\82\82¯\82±", 0, 11);
- x2("^\\w...\82¤\82¦\82¨$", "z\82 \82¢\82¤\82¤\82¦\82¨", 0, 13);
- x2("\\w\\w\\s\\W\82¨\82¨\82¨\\d", "a\82¨ \82¨\82¨\82¨4", 0, 12);
- x2("\\A\82½\82¿\82Â", "\82½\82¿\82Â", 0, 6);
- x2("\82Þ\82ß\82à\\Z", "\82Þ\82ß\82à", 0, 6);
- x2("\82©\82«\82\\z", "\82©\82«\82", 0, 6);
- x2("\82©\82«\82\\Z", "\82©\82«\82\n", 0, 6);
- x2("\\G\82Û\82Ò", "\82Û\82Ò", 0, 4);
- n("\\G\82¦", "\82¤\82¦\82¨");
- n("\82Æ\82Ä\\G", "\82Æ\82Ä");
- n("\82Ü\82Ý\\A", "\82Ü\82Ý");
- n("\82Ü\\A\82Ý", "\82Ü\82Ý");
- x2("(?=\82¹)\82¹", "\82¹", 0, 2);
- n("(?=\82¤).", "\82¢");
- x2("(?!\82¤)\82©", "\82©", 0, 2);
- n("(?!\82Æ)\82 ", "\82Æ");
- x2("(?i:\82 )", "\82 ", 0, 2);
- x2("(?i:\82Ô\82×)", "\82Ô\82×", 0, 4);
- n("(?i:\82¢)", "\82¤");
- x2("(?m:\82æ.)", "\82æ\n", 0, 3);
- x2("(?m:.\82ß)", "\82Ü\n\82ß", 2, 5);
- x2("\82 ?", "", 0, 0);
- x2("\95Ï?", "\89»", 0, 0);
- x2("\95Ï?", "\95Ï", 0, 2);
- x2("\97Ê*", "", 0, 0);
- x2("\97Ê*", "\97Ê", 0, 2);
- x2("\8eq*", "\8eq\8eq\8eq", 0, 6);
- x2("\94n*", "\8e\94n\94n\94n\94n", 0, 0);
- n("\8eR+", "");
- x2("\89Í+", "\89Í", 0, 2);
- x2("\8e\9e+", "\8e\9e\8e\9e\8e\9e\8e\9e", 0, 8);
- x2("\82¦+", "\82¦\82¦\82¤\82¤\82¤", 0, 4);
- x2("\82¤+", "\82¨\82¤\82¤\82¤\82¤", 2, 10);
- x2(".?", "\82½", 0, 2);
- x2(".*", "\82Ï\82Ò\82Õ\82Ø", 0, 8);
- x2(".+", "\82ë", 0, 2);
- x2(".+", "\82¢\82¤\82¦\82©\n", 0, 8);
- x2("\82 |\82¢", "\82 ", 0, 2);
- x2("\82 |\82¢", "\82¢", 0, 2);
- x2("\82 \82¢|\82¢\82¤", "\82 \82¢", 0, 4);
- x2("\82 \82¢|\82¢\82¤", "\82¢\82¤", 0, 4);
- x2("\82ð(?:\82©\82«|\82«\82)", "\82ð\82©\82«", 0, 6);
- x2("\82ð(?:\82©\82«|\82«\82)\82¯", "\82ð\82«\82\82¯", 0, 8);
- x2("\82 \82¢|(?:\82 \82¤|\82 \82ð)", "\82 \82ð", 0, 4);
- x2("\82 |\82¢|\82¤", "\82¦\82¤", 2, 4);
- x2("\82 |\82¢|\82¤\82¦|\82¨\82©\82«|\82|\82¯\82±\82³|\82µ\82·\82¹|\82»|\82½\82¿|\82Â\82Ä\82Æ\82È\82É|\82Ê\82Ë", "\82µ\82·\82¹", 0, 6);
- n("\82 |\82¢|\82¤\82¦|\82¨\82©\82«|\82|\82¯\82±\82³|\82µ\82·\82¹|\82»|\82½\82¿|\82Â\82Ä\82Æ\82È\82É|\82Ê\82Ë", "\82·\82¹");
- x2("\82 |^\82í", "\82Ô\82 ", 2, 4);
- x2("\82 |^\82ð", "\82ð\82 ", 0, 2);
- x2("\8bS|\\G\8eÔ", "\82¯\8eÔ\8bS", 4, 6);
- x2("\8bS|\\G\8eÔ", "\8eÔ\8bS", 0, 2);
- x2("\8bS|\\A\8eÔ", "b\8eÔ\8bS", 3, 5);
- x2("\8bS|\\A\8eÔ", "\8eÔ", 0, 2);
- x2("\8bS|\8eÔ\\Z", "\8eÔ\8bS", 2, 4);
- x2("\8bS|\8eÔ\\Z", "\8eÔ", 0, 2);
- x2("\8bS|\8eÔ\\Z", "\8eÔ\n", 0, 2);
- x2("\8bS|\8eÔ\\z", "\8eÔ\8bS", 2, 4);
- x2("\8bS|\8eÔ\\z", "\8eÔ", 0, 2);
- x2("\\w|\\s", "\82¨", 0, 2);
- x2("\\w|%", "%\82¨", 0, 1);
- x2("\\w|[&$]", "\82¤&", 0, 2);
- x2("[\82¢-\82¯]", "\82¤", 0, 2);
- x2("[\82¢-\82¯]|[^\82©-\82±]", "\82 ", 0, 2);
- x2("[\82¢-\82¯]|[^\82©-\82±]", "\82©", 0, 2);
- x2("(?:\82 |[\82¤-\82«])|\82¢\82ð", "\82¤\82ð", 0, 2);
- x2("(?:\82 |[\82¤-\82«])|\82¢\82ð", "\82¢\82ð", 0, 4);
- x2("\82 \82¢\82¤|(?=\82¯\82¯)..\82Ù", "\82¯\82¯\82Ù", 0, 6);
- x2("\82 \82¢\82¤|(?!\82¯\82¯)..\82Ù", "\82 \82¢\82Ù", 0, 6);
- x2("(?=\82ð\82 )..\82 |(?=\82ð\82ð)..\82 ", "\82ð\82ð\82 ", 0, 6);
- x2("(?<=\82 |\82¢\82¤)\82¢", "\82¢\82¤\82¢", 4, 6);
- n("(?>\82 |\82 \82¢\82¦)\82¤", "\82 \82¢\82¦\82¤");
- x2("(?>\82 \82¢\82¦|\82 )\82¤", "\82 \82¢\82¦\82¤", 0, 8);
- x2("\82 ?|\82¢", "\82 ", 0, 2);
- x2("\82 ?|\82¢", "\82¢", 0, 0);
- x2("\82 ?|\82¢", "", 0, 0);
- x2("\82 *|\82¢", "\82 \82 ", 0, 4);
- x2("\82 *|\82¢*", "\82¢\82 ", 0, 0);
- x2("\82 *|\82¢*", "\82 \82¢", 0, 2);
- x2("[a\82 ]*|\82¢*", "a\82 \82¢\82¢\82¢", 0, 3);
- x2("\82 +|\82¢*", "", 0, 0);
- x2("\82 +|\82¢*", "\82¢\82¢\82¢", 0, 6);
- x2("\82 +|\82¢*", "\82 \82¢\82¢\82¢", 0, 2);
- x2("\82 +|\82¢*", "a\82 \82¢\82¢\82¢", 0, 0);
- n("\82 +|\82¢+", "");
- x2("(\82 |\82¢)?", "\82¢", 0, 2);
- x2("(\82 |\82¢)*", "\82¢\82 ", 0, 4);
- x2("(\82 |\82¢)+", "\82¢\82 \82¢", 0, 6);
- x2("(\82 \82¢|\82¤\82 )+", "\82¤\82 \82 \82¢\82¤\82¦", 0, 8);
- x2("(\82 \82¢|\82¤\82¦)+", "\82¤\82 \82 \82¢\82¤\82¦", 4, 12);
- x2("(\82 \82¢|\82¤\82 )+", "\82 \82 \82¢\82¤\82 ", 2, 10);
- x2("(\82 \82¢|\82¤\82 )+", "\82 \82¢\82ð\82¤\82 ", 0, 4);
- x2("(\82 \82¢|\82¤\82 )+", "$$zzzz\82 \82¢\82ð\82¤\82 ", 6, 10);
- x2("(\82 |\82¢\82 \82¢)+", "\82 \82¢\82 \82¢\82 ", 0, 10);
- x2("(\82 |\82¢\82 \82¢)+", "\82¢\82 ", 2, 4);
- x2("(\82 |\82¢\82 \82¢)+", "\82¢\82 \82 \82 \82¢\82 ", 2, 8);
- x2("(?:\82 |\82¢)(?:\82 |\82¢)", "\82 \82¢", 0, 4);
- x2("(?:\82 *|\82¢*)(?:\82 *|\82¢*)", "\82 \82 \82 \82¢\82¢\82¢", 0, 6);
- x2("(?:\82 *|\82¢*)(?:\82 +|\82¢+)", "\82 \82 \82 \82¢\82¢\82¢", 0, 12);
- x2("(?:\82 +|\82¢+){2}", "\82 \82 \82 \82¢\82¢\82¢", 0, 12);
- x2("(?:\82 +|\82¢+){1,2}", "\82 \82 \82 \82¢\82¢\82¢", 0, 12);
- x2("(?:\82 +|\\A\82¢*)\82¤\82¤", "\82¤\82¤", 0, 4);
- n("(?:\82 +|\\A\82¢*)\82¤\82¤", "\82 \82¢\82¤\82¤");
- x2("(?:^\82 +|\82¢+)*\82¤", "\82 \82 \82¢\82¢\82¢\82 \82¢\82¤", 12, 16);
- x2("(?:^\82 +|\82¢+)*\82¤", "\82 \82 \82¢\82¢\82¢\82¢\82¤", 0, 14);
- x2("\82¤{0,}", "\82¤\82¤\82¤\82¤", 0, 8);
- x2("\82 |(?i)c", "C", 0, 1);
- x2("(?i)c|\82 ", "C", 0, 1);
- x2("(?i:\82 )|a", "a", 0, 1);
- n("(?i:\82 )|a", "A");
- x2("[\82 \82¢\82¤]?", "\82 \82¢\82¤", 0, 2);
- x2("[\82 \82¢\82¤]*", "\82 \82¢\82¤", 0, 6);
- x2("[^\82 \82¢\82¤]*", "\82 \82¢\82¤", 0, 0);
- n("[^\82 \82¢\82¤]+", "\82 \82¢\82¤");
- x2("\82 ?\?", "\82 \82 \82 ", 0, 0);
- x2("\82¢\82 ?\?\82¢", "\82¢\82 \82¢", 0, 6);
- x2("\82 *?", "\82 \82 \82 ", 0, 0);
- x2("\82¢\82 *?", "\82¢\82 \82 ", 0, 2);
- x2("\82¢\82 *?\82¢", "\82¢\82 \82 \82¢", 0, 8);
- x2("\82 +?", "\82 \82 \82 ", 0, 2);
- x2("\82¢\82 +?", "\82¢\82 \82 ", 0, 4);
- x2("\82¢\82 +?\82¢", "\82¢\82 \82 \82¢", 0, 8);
- x2("(?:\93V?)?\?", "\93V", 0, 0);
- x2("(?:\93V?\?)?", "\93V", 0, 0);
- x2("(?:\96²?)+?", "\96²\96²\96²", 0, 2);
- x2("(?:\95\97+)?\?", "\95\97\95\97\95\97", 0, 0);
- x2("(?:\90á+)?\?\91\9a", "\90á\90á\90á\91\9a", 0, 8);
- x2("(?:\82 \82¢)?{2}", "", 0, 0);
- x2("(?:\8bS\8eÔ)?{2}", "\8bS\8eÔ\8bS\8eÔ\8bS", 0, 8);
- x2("(?:\8bS\8eÔ)*{0}", "\8bS\8eÔ\8bS\8eÔ\8bS", 0, 0);
- x2("(?:\8bS\8eÔ){3,}", "\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ", 0, 16);
- n("(?:\8bS\8eÔ){3,}", "\8bS\8eÔ\8bS\8eÔ");
- x2("(?:\8bS\8eÔ){2,4}", "\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ", 0, 12);
- x2("(?:\8bS\8eÔ){2,4}", "\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ", 0, 16);
- x2("(?:\8bS\8eÔ){2,4}?", "\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ\8bS\8eÔ", 0, 8);
- x2("(?:\8bS\8eÔ){,}", "\8bS\8eÔ{,}", 0, 7);
- x2("(?:\82©\82«\82)+?{2}", "\82©\82«\82\82©\82«\82\82©\82«\82", 0, 12);
- x3("(\89Î)", "\89Î", 0, 2, 1);
- x3("(\89Î\90\85)", "\89Î\90\85", 0, 4, 1);
- x2("((\8e\9e\8aÔ))", "\8e\9e\8aÔ", 0, 4);
- x3("((\95\97\90\85))", "\95\97\90\85", 0, 4, 1);
- x3("((\8dð\93ú))", "\8dð\93ú", 0, 4, 2);
- x3("((((((((((((((((((((\97Ê\8eq))))))))))))))))))))", "\97Ê\8eq", 0, 4, 20);
- x3("(\82 \82¢)(\82¤\82¦)", "\82 \82¢\82¤\82¦", 0, 4, 1);
- x3("(\82 \82¢)(\82¤\82¦)", "\82 \82¢\82¤\82¦", 4, 8, 2);
- x3("()(\82 )\82¢\82¤(\82¦\82¨\82©)\82«\82\82¯\82±", "\82 \82¢\82¤\82¦\82¨\82©\82«\82\82¯\82±", 6, 12, 3);
- x3("(()(\82 )\82¢\82¤(\82¦\82¨\82©)\82«\82\82¯\82±)", "\82 \82¢\82¤\82¦\82¨\82©\82«\82\82¯\82±", 6, 12, 4);
- x3(".*(\83t\83H)\83\93\81E\83}(\83\93()\83V\83\85\83^)\83C\83\93", "\83t\83H\83\93\81E\83}\83\93\83V\83\85\83^\83C\83\93", 10, 18, 2);
- x2("(^\82 )", "\82 ", 0, 2);
- x3("(\82 )|(\82 )", "\82¢\82 ", 2, 4, 1);
- x3("(^\82 )|(\82 )", "\82¢\82 ", 2, 4, 2);
- x3("(\82 ?)", "\82 \82 \82 ", 0, 2, 1);
- x3("(\82Ü*)", "\82Ü\82Ü\82Ü", 0, 6, 1);
- x3("(\82Æ*)", "", 0, 0, 1);
- x3("(\82é+)", "\82é\82é\82é\82é\82é\82é\82é", 0, 14, 1);
- x3("(\82Ó+|\82Ö*)", "\82Ó\82Ó\82Ó\82Ö\82Ö", 0, 6, 1);
- x3("(\82 +|\82¢?)", "\82¢\82¢\82¢\82 \82 ", 0, 2, 1);
- x3("(\82 \82¢\82¤)?", "\82 \82¢\82¤", 0, 6, 1);
- x3("(\82 \82¢\82¤)*", "\82 \82¢\82¤", 0, 6, 1);
- x3("(\82 \82¢\82¤)+", "\82 \82¢\82¤", 0, 6, 1);
- x3("(\82³\82µ\82·|\82 \82¢\82¤)+", "\82 \82¢\82¤", 0, 6, 1);
- x3("([\82È\82É\82Ê][\82©\82«\82]|\82©\82«\82)+", "\82©\82«\82", 0, 6, 1);
- x3("((?i:\82 \82¢\82¤))", "\82 \82¢\82¤", 0, 6, 1);
- x3("((?m:\82 .\82¤))", "\82 \n\82¤", 0, 5, 1);
- x3("((?=\82 \82ñ)\82 )", "\82 \82ñ\82¢", 0, 2, 1);
- x3("\82 \82¢\82¤|(.\82 \82¢\82¦)", "\82ñ\82 \82¢\82¦", 0, 8, 1);
- x3("\82 *(.)", "\82 \82 \82 \82 \82ñ", 8, 10, 1);
- x3("\82 *?(.)", "\82 \82 \82 \82 \82ñ", 0, 2, 1);
- x3("\82 *?(\82ñ)", "\82 \82 \82 \82 \82ñ", 8, 10, 1);
- x3("[\82¢\82¤\82¦]\82 *(.)", "\82¦\82 \82 \82 \82 \82ñ", 10, 12, 1);
- x3("(\\A\82¢\82¢)\82¤\82¤", "\82¢\82¢\82¤\82¤", 0, 4, 1);
- n("(\\A\82¢\82¢)\82¤\82¤", "\82ñ\82¢\82¢\82¤\82¤");
- x3("(^\82¢\82¢)\82¤\82¤", "\82¢\82¢\82¤\82¤", 0, 4, 1);
- n("(^\82¢\82¢)\82¤\82¤", "\82ñ\82¢\82¢\82¤\82¤");
- x3("\82ë\82ë(\82é\82é$)", "\82ë\82ë\82é\82é", 4, 8, 1);
- n("\82ë\82ë(\82é\82é$)", "\82ë\82ë\82é\82é\82é");
- x2("(\96³)\\1", "\96³\96³", 0, 4);
- n("(\96³)\\1", "\96³\95\90");
- x2("(\8bó?)\\1", "\8bó\8bó", 0, 4);
- x2("(\8bó?\?)\\1", "\8bó\8bó", 0, 0);
- x2("(\8bó*)\\1", "\8bó\8bó\8bó\8bó\8bó", 0, 8);
- x3("(\8bó*)\\1", "\8bó\8bó\8bó\8bó\8bó", 0, 4, 1);
- x2("\82 (\82¢*)\\1", "\82 \82¢\82¢\82¢\82¢", 0, 10);
- x2("\82 (\82¢*)\\1", "\82 \82¢", 0, 2);
- x2("(\82 *)(\82¢*)\\1\\2", "\82 \82 \82 \82¢\82¢\82 \82 \82 \82¢\82¢", 0, 20);
- x2("(\82 *)(\82¢*)\\2", "\82 \82 \82 \82¢\82¢\82¢\82¢", 0, 14);
- x3("(\82 *)(\82¢*)\\2", "\82 \82 \82 \82¢\82¢\82¢\82¢", 6, 10, 2);
- x2("(((((((\82Û*)\82Ø))))))\82Ò\\7", "\82Û\82Û\82Û\82Ø\82Ò\82Û\82Û\82Û", 0, 16);
- x3("(((((((\82Û*)\82Ø))))))\82Ò\\7", "\82Û\82Û\82Û\82Ø\82Ò\82Û\82Û\82Û", 0, 6, 7);
- x2("(\82Í)(\82Ð)(\82Ó)\\2\\1\\3", "\82Í\82Ð\82Ó\82Ð\82Í\82Ó", 0, 12);
- x2("([\82«-\82¯])\\1", "\82\82", 0, 4);
- x2("(\\w\\d\\s)\\1", "\82 5 \82 5 ", 0, 8);
- n("(\\w\\d\\s)\\1", "\82 5 \82 5");
- x2("(\92N\81H|[\82 -\82¤]{3})\\1", "\92N\81H\92N\81H", 0, 8);
- x2("...(\92N\81H|[\82 -\82¤]{3})\\1", "\82 a\82 \92N\81H\92N\81H", 0, 13);
- x2("(\92N\81H|[\82 -\82¤]{3})\\1", "\82¤\82¢\82¤\82¤\82¢\82¤", 0, 12);
- x2("(^\82±)\\1", "\82±\82±", 0, 4);
- n("(^\82Þ)\\1", "\82ß\82Þ\82Þ");
- n("(\82 $)\\1", "\82 \82 ");
- n("(\82 \82¢\\Z)\\1", "\82 \82¢");
- x2("(\82 *\\Z)\\1", "\82 ", 2, 2);
- x2(".(\82 *\\Z)\\1", "\82¢\82 ", 2, 4);
- x3("(.(\82â\82¢\82ä)\\2)", "z\82â\82¢\82ä\82â\82¢\82ä", 0, 13, 1);
- x3("(.(..\\d.)\\2)", "\82 12341234", 0, 10, 1);
- x2("((?i:\82 v\82¸))\\1", "\82 v\82¸\82 v\82¸", 0, 10);
- x2("(?<\8bð\82©>\95Ï|\\(\\g<\8bð\82©>\\))", "((((((\95Ï))))))", 0, 14);
- x2("\\A(?:\\g<\88¢-1>|\\g<\89]-2>|\\z\8fI\97¹ (?<\88¢-1>\8aÏ|\8e©\\g<\89]-2>\8e©)(?<\89]-2>\8dÝ|\95ì\8eF\\g<\88¢-1>\95ì\8eF))$", "\95ì\8eF\8e©\95ì\8eF\8e©\8dÝ\8e©\95ì\8eF\8e©\95ì\8eF", 0, 26);
- x2("[[\82Ð\82Ó]]", "\82Ó", 0, 2);
- x2("[[\82¢\82¨\82¤]\82©]", "\82©", 0, 2);
- n("[[^\82 ]]", "\82 ");
- n("[^[\82 ]]", "\82 ");
- x2("[^[^\82 ]]", "\82 ", 0, 2);
- x2("[[\82©\82«\82]&&\82«\82]", "\82", 0, 2);
- n("[[\82©\82«\82]&&\82«\82]", "\82©");
- n("[[\82©\82«\82]&&\82«\82]", "\82¯");
- x2("[\82 -\82ñ&&\82¢-\82ð&&\82¤-\82ï]", "\82ï", 0, 2);
- n("[^\82 -\82ñ&&\82¢-\82ð&&\82¤-\82ï]", "\82ï");
- x2("[[^\82 &&\82 ]&&\82 -\82ñ]", "\82¢", 0, 2);
- n("[[^\82 &&\82 ]&&\82 -\82ñ]", "\82 ");
- x2("[[^\82 -\82ñ&&\82¢\82¤\82¦\82¨]&&[^\82¤-\82©]]", "\82«", 0, 2);
- n("[[^\82 -\82ñ&&\82¢\82¤\82¦\82¨]&&[^\82¤-\82©]]", "\82¢");
- x2("[^[^\82 \82¢\82¤]&&[^\82¤\82¦\82¨]]", "\82¤", 0, 2);
- x2("[^[^\82 \82¢\82¤]&&[^\82¤\82¦\82¨]]", "\82¦", 0, 2);
- n("[^[^\82 \82¢\82¤]&&[^\82¤\82¦\82¨]]", "\82©");
- x2("[\82 -&&-\82 ]", "-", 0, 1);
- x2("[^[^a-z\82 \82¢\82¤]&&[^bcdefg\82¤\82¦\82¨]q-w]", "\82¦", 0, 2);
- x2("[^[^a-z\82 \82¢\82¤]&&[^bcdefg\82¤\82¦\82¨]g-w]", "f", 0, 1);
- x2("[^[^a-z\82 \82¢\82¤]&&[^bcdefg\82¤\82¦\82¨]g-w]", "g", 0, 1);
- n("[^[^a-z\82 \82¢\82¤]&&[^bcdefg\82¤\82¦\82¨]g-w]", "2");
- fprintf(stdout, "\nRESULT SUCC: %d, FAIL: %d\n", nsucc, nfail);
+ x2(".", "¤¢", 0, 2);
+ x2("..", "¤«¤", 0, 4);
+ x2("\\w", "¤ª", 0, 2);
+ n("\\W", "¤¢");
+ x2("[\\W]", "¤¦$", 2, 3);
+ x2("\\S", "¤½", 0, 2);
+ x2("\\S", "´Á", 0, 2);
+ x2("\\b", "µ¤ ", 0, 0);
+ x2("\\b", " ¤Û", 1, 1);
+ x2("\\B", "¤»¤½ ", 2, 2);
+ x2("\\B", "¤¦ ", 3, 3);
+ x2("\\B", " ¤¤", 0, 0);
+ x2("[¤¿¤Á]", "¤Á", 0, 2);
+ n("[¤Ê¤Ë]", "¤Ì");
+ x2("[¤¦-¤ª]", "¤¨", 0, 2);
+ n("[^¤±]", "¤±");
+ x2("[\\w]", "¤Í", 0, 2);
+ n("[\\d]", "¤Õ");
+ x2("[\\D]", "¤Ï", 0, 2);
+ n("[\\s]", "¤¯");
+ x2("[\\S]", "¤Ø", 0, 2);
+ x2("[\\w\\d]", "¤è", 0, 2);
+ x2("[\\w\\d]", " ¤è", 3, 5);
+ n("\\wµ´¼Ö", " µ´¼Ö");
+ x2("µ´\\W¼Ö", "µ´ ¼Ö", 0, 5);
+ x2("¤¢.¤¤.¤¦", "¤¢¤¢¤¤¤¤¤¦", 0, 10);
+ x2(".\\w¤¦\\W..¤¾", "¤¨¤¦¤¦ ¤¦¤¾¤¾", 0, 13);
+ x2("\\s\\w¤³¤³¤³", " ¤³¤³¤³¤³", 0, 9);
+ x2("¤¢¤¢.¤±", "¤¢¤¢¤±¤±", 0, 8);
+ n(".¤¤", "¤¤¤¨");
+ x2(".¤ª", "¤ª¤ª", 0, 4);
+ x2("^¤¢", "¤¢", 0, 2);
+ x2("^¤à$", "¤à", 0, 2);
+ x2("^\\w$", "¤Ë", 0, 2);
+ x2("^\\w¤«¤¤¯¤±¤³$", "z¤«¤¤¯¤±¤³", 0, 11);
+ x2("^\\w...¤¦¤¨¤ª$", "z¤¢¤¤¤¦¤¦¤¨¤ª", 0, 13);
+ x2("\\w\\w\\s\\W¤ª¤ª¤ª\\d", "a¤ª ¤ª¤ª¤ª4", 0, 12);
+ x2("\\A¤¿¤Á¤Ä", "¤¿¤Á¤Ä", 0, 6);
+ x2("¤à¤á¤â\\Z", "¤à¤á¤â", 0, 6);
+ x2("¤«¤¤¯\\z", "¤«¤¤¯", 0, 6);
+ x2("¤«¤¤¯\\Z", "¤«¤¤¯\n", 0, 6);
+ x2("\\G¤Ý¤Ô", "¤Ý¤Ô", 0, 4);
+ n("\\G¤¨", "¤¦¤¨¤ª");
+ n("¤È¤Æ\\G", "¤È¤Æ");
+ n("¤Þ¤ß\\A", "¤Þ¤ß");
+ n("¤Þ\\A¤ß", "¤Þ¤ß");
+ x2("(?=¤»)¤»", "¤»", 0, 2);
+ n("(?=¤¦).", "¤¤");
+ x2("(?!¤¦)¤«", "¤«", 0, 2);
+ n("(?!¤È)¤¢", "¤È");
+ x2("(?i:¤¢)", "¤¢", 0, 2);
+ x2("(?i:¤Ö¤Ù)", "¤Ö¤Ù", 0, 4);
+ n("(?i:¤¤)", "¤¦");
+ x2("(?m:¤è.)", "¤è\n", 0, 3);
+ x2("(?m:.¤á)", "¤Þ\n¤á", 2, 5);
+ x2("¤¢?", "", 0, 0);
+ x2("ÊÑ?", "²½", 0, 0);
+ x2("ÊÑ?", "ÊÑ", 0, 2);
+ x2("ÎÌ*", "", 0, 0);
+ x2("ÎÌ*", "ÎÌ", 0, 2);
+ x2("»Ò*", "»Ò»Ò»Ò", 0, 6);
+ x2("ÇÏ*", "¼¯ÇÏÇÏÇÏÇÏ", 0, 0);
+ n("»³+", "");
+ x2("²Ï+", "²Ï", 0, 2);
+ x2("»þ+", "»þ»þ»þ»þ", 0, 8);
+ x2("¤¨+", "¤¨¤¨¤¦¤¦¤¦", 0, 4);
+ x2("¤¦+", "¤ª¤¦¤¦¤¦¤¦", 2, 10);
+ x2(".?", "¤¿", 0, 2);
+ x2(".*", "¤Ñ¤Ô¤×¤Ú", 0, 8);
+ x2(".+", "¤í", 0, 2);
+ x2(".+", "¤¤¤¦¤¨¤«\n", 0, 8);
+ x2("¤¢|¤¤", "¤¢", 0, 2);
+ x2("¤¢|¤¤", "¤¤", 0, 2);
+ x2("¤¢¤¤|¤¤¤¦", "¤¢¤¤", 0, 4);
+ x2("¤¢¤¤|¤¤¤¦", "¤¤¤¦", 0, 4);
+ x2("¤ò(?:¤«¤|¤¤¯)", "¤ò¤«¤", 0, 6);
+ x2("¤ò(?:¤«¤|¤¤¯)¤±", "¤ò¤¤¯¤±", 0, 8);
+ x2("¤¢¤¤|(?:¤¢¤¦|¤¢¤ò)", "¤¢¤ò", 0, 4);
+ x2("¤¢|¤¤|¤¦", "¤¨¤¦", 2, 4);
+ x2("¤¢|¤¤|¤¦¤¨|¤ª¤«¤|¤¯|¤±¤³¤µ|¤·¤¹¤»|¤½|¤¿¤Á|¤Ä¤Æ¤È¤Ê¤Ë|¤Ì¤Í", "¤·¤¹¤»", 0, 6);
+ n("¤¢|¤¤|¤¦¤¨|¤ª¤«¤|¤¯|¤±¤³¤µ|¤·¤¹¤»|¤½|¤¿¤Á|¤Ä¤Æ¤È¤Ê¤Ë|¤Ì¤Í", "¤¹¤»");
+ x2("¤¢|^¤ï", "¤Ö¤¢", 2, 4);
+ x2("¤¢|^¤ò", "¤ò¤¢", 0, 2);
+ x2("µ´|\\G¼Ö", "¤±¼Öµ´", 4, 6);
+ x2("µ´|\\G¼Ö", "¼Öµ´", 0, 2);
+ x2("µ´|\\A¼Ö", "b¼Öµ´", 3, 5);
+ x2("µ´|\\A¼Ö", "¼Ö", 0, 2);
+ x2("µ´|¼Ö\\Z", "¼Öµ´", 2, 4);
+ x2("µ´|¼Ö\\Z", "¼Ö", 0, 2);
+ x2("µ´|¼Ö\\Z", "¼Ö\n", 0, 2);
+ x2("µ´|¼Ö\\z", "¼Öµ´", 2, 4);
+ x2("µ´|¼Ö\\z", "¼Ö", 0, 2);
+ x2("\\w|\\s", "¤ª", 0, 2);
+ x2("\\w|%", "%¤ª", 0, 1);
+ x2("\\w|[&$]", "¤¦&", 0, 2);
+ x2("[¤¤-¤±]", "¤¦", 0, 2);
+ x2("[¤¤-¤±]|[^¤«-¤³]", "¤¢", 0, 2);
+ x2("[¤¤-¤±]|[^¤«-¤³]", "¤«", 0, 2);
+ x2("[^¤¢]", "\n", 0, 1);
+ x2("(?:¤¢|[¤¦-¤])|¤¤¤ò", "¤¦¤ò", 0, 2);
+ x2("(?:¤¢|[¤¦-¤])|¤¤¤ò", "¤¤¤ò", 0, 4);
+ x2("¤¢¤¤¤¦|(?=¤±¤±)..¤Û", "¤±¤±¤Û", 0, 6);
+ x2("¤¢¤¤¤¦|(?!¤±¤±)..¤Û", "¤¢¤¤¤Û", 0, 6);
+ x2("(?=¤ò¤¢)..¤¢|(?=¤ò¤ò)..¤¢", "¤ò¤ò¤¢", 0, 6);
+ x2("(?<=¤¢|¤¤¤¦)¤¤", "¤¤¤¦¤¤", 4, 6);
+ n("(?>¤¢|¤¢¤¤¤¨)¤¦", "¤¢¤¤¤¨¤¦");
+ x2("(?>¤¢¤¤¤¨|¤¢)¤¦", "¤¢¤¤¤¨¤¦", 0, 8);
+ x2("¤¢?|¤¤", "¤¢", 0, 2);
+ x2("¤¢?|¤¤", "¤¤", 0, 0);
+ x2("¤¢?|¤¤", "", 0, 0);
+ x2("¤¢*|¤¤", "¤¢¤¢", 0, 4);
+ x2("¤¢*|¤¤*", "¤¤¤¢", 0, 0);
+ x2("¤¢*|¤¤*", "¤¢¤¤", 0, 2);
+ x2("[a¤¢]*|¤¤*", "a¤¢¤¤¤¤¤¤", 0, 3);
+ x2("¤¢+|¤¤*", "", 0, 0);
+ x2("¤¢+|¤¤*", "¤¤¤¤¤¤", 0, 6);
+ x2("¤¢+|¤¤*", "¤¢¤¤¤¤¤¤", 0, 2);
+ x2("¤¢+|¤¤*", "a¤¢¤¤¤¤¤¤", 0, 0);
+ n("¤¢+|¤¤+", "");
+ x2("(¤¢|¤¤)?", "¤¤", 0, 2);
+ x2("(¤¢|¤¤)*", "¤¤¤¢", 0, 4);
+ x2("(¤¢|¤¤)+", "¤¤¤¢¤¤", 0, 6);
+ x2("(¤¢¤¤|¤¦¤¢)+", "¤¦¤¢¤¢¤¤¤¦¤¨", 0, 8);
+ x2("(¤¢¤¤|¤¦¤¨)+", "¤¦¤¢¤¢¤¤¤¦¤¨", 4, 12);
+ x2("(¤¢¤¤|¤¦¤¢)+", "¤¢¤¢¤¤¤¦¤¢", 2, 10);
+ x2("(¤¢¤¤|¤¦¤¢)+", "¤¢¤¤¤ò¤¦¤¢", 0, 4);
+ x2("(¤¢¤¤|¤¦¤¢)+", "$$zzzz¤¢¤¤¤ò¤¦¤¢", 6, 10);
+ x2("(¤¢|¤¤¤¢¤¤)+", "¤¢¤¤¤¢¤¤¤¢", 0, 10);
+ x2("(¤¢|¤¤¤¢¤¤)+", "¤¤¤¢", 2, 4);
+ x2("(¤¢|¤¤¤¢¤¤)+", "¤¤¤¢¤¢¤¢¤¤¤¢", 2, 8);
+ x2("(?:¤¢|¤¤)(?:¤¢|¤¤)", "¤¢¤¤", 0, 4);
+ x2("(?:¤¢*|¤¤*)(?:¤¢*|¤¤*)", "¤¢¤¢¤¢¤¤¤¤¤¤", 0, 6);
+ x2("(?:¤¢*|¤¤*)(?:¤¢+|¤¤+)", "¤¢¤¢¤¢¤¤¤¤¤¤", 0, 12);
+ x2("(?:¤¢+|¤¤+){2}", "¤¢¤¢¤¢¤¤¤¤¤¤", 0, 12);
+ x2("(?:¤¢+|¤¤+){1,2}", "¤¢¤¢¤¢¤¤¤¤¤¤", 0, 12);
+ x2("(?:¤¢+|\\A¤¤*)¤¦¤¦", "¤¦¤¦", 0, 4);
+ n("(?:¤¢+|\\A¤¤*)¤¦¤¦", "¤¢¤¤¤¦¤¦");
+ x2("(?:^¤¢+|¤¤+)*¤¦", "¤¢¤¢¤¤¤¤¤¤¤¢¤¤¤¦", 12, 16);
+ x2("(?:^¤¢+|¤¤+)*¤¦", "¤¢¤¢¤¤¤¤¤¤¤¤¤¦", 0, 14);
+ x2("¤¦{0,}", "¤¦¤¦¤¦¤¦", 0, 8);
+ x2("¤¢|(?i)c", "C", 0, 1);
+ x2("(?i)c|¤¢", "C", 0, 1);
+ x2("(?i:¤¢)|a", "a", 0, 1);
+ n("(?i:¤¢)|a", "A");
+ x2("[¤¢¤¤¤¦]?", "¤¢¤¤¤¦", 0, 2);
+ x2("[¤¢¤¤¤¦]*", "¤¢¤¤¤¦", 0, 6);
+ x2("[^¤¢¤¤¤¦]*", "¤¢¤¤¤¦", 0, 0);
+ n("[^¤¢¤¤¤¦]+", "¤¢¤¤¤¦");
+ x2("¤¢??", "¤¢¤¢¤¢", 0, 0);
+ x2("¤¤¤¢??¤¤", "¤¤¤¢¤¤", 0, 6);
+ x2("¤¢*?", "¤¢¤¢¤¢", 0, 0);
+ x2("¤¤¤¢*?", "¤¤¤¢¤¢", 0, 2);
+ x2("¤¤¤¢*?¤¤", "¤¤¤¢¤¢¤¤", 0, 8);
+ x2("¤¢+?", "¤¢¤¢¤¢", 0, 2);
+ x2("¤¤¤¢+?", "¤¤¤¢¤¢", 0, 4);
+ x2("¤¤¤¢+?¤¤", "¤¤¤¢¤¢¤¤", 0, 8);
+ x2("(?:ŷ?)??", "ŷ", 0, 0);
+ x2("(?:ŷ??)?", "ŷ", 0, 0);
+ x2("(?:̴?)+?", "̴̴̴", 0, 2);
+ x2("(?:É÷+)??", "É÷É÷É÷", 0, 0);
+ x2("(?:Àã+)??Áú", "ÀãÀãÀãÁú", 0, 8);
+ x2("(?:¤¢¤¤)?{2}", "", 0, 0);
+ x2("(?:µ´¼Ö)?{2}", "µ´¼Öµ´¼Öµ´", 0, 8);
+ x2("(?:µ´¼Ö)*{0}", "µ´¼Öµ´¼Öµ´", 0, 0);
+ x2("(?:µ´¼Ö){3,}", "µ´¼Öµ´¼Öµ´¼Öµ´¼Ö", 0, 16);
+ n("(?:µ´¼Ö){3,}", "µ´¼Öµ´¼Ö");
+ x2("(?:µ´¼Ö){2,4}", "µ´¼Öµ´¼Öµ´¼Ö", 0, 12);
+ x2("(?:µ´¼Ö){2,4}", "µ´¼Öµ´¼Öµ´¼Öµ´¼Öµ´¼Ö", 0, 16);
+ x2("(?:µ´¼Ö){2,4}?", "µ´¼Öµ´¼Öµ´¼Öµ´¼Öµ´¼Ö", 0, 8);
+ x2("(?:µ´¼Ö){,}", "µ´¼Ö{,}", 0, 7);
+ x2("(?:¤«¤¤¯)+?{2}", "¤«¤¤¯¤«¤¤¯¤«¤¤¯", 0, 12);
+ x3("(²Ð)", "²Ð", 0, 2, 1);
+ x3("(²Ð¿å)", "²Ð¿å", 0, 4, 1);
+ x2("((»þ´Ö))", "»þ´Ö", 0, 4);
+ x3("((É÷¿å))", "É÷¿å", 0, 4, 1);
+ x3("((ºòÆü))", "ºòÆü", 0, 4, 2);
+ x3("((((((((((((((((((((ÎÌ»Ò))))))))))))))))))))", "ÎÌ»Ò", 0, 4, 20);
+ x3("(¤¢¤¤)(¤¦¤¨)", "¤¢¤¤¤¦¤¨", 0, 4, 1);
+ x3("(¤¢¤¤)(¤¦¤¨)", "¤¢¤¤¤¦¤¨", 4, 8, 2);
+ x3("()(¤¢)¤¤¤¦(¤¨¤ª¤«)¤¤¯¤±¤³", "¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³", 6, 12, 3);
+ x3("(()(¤¢)¤¤¤¦(¤¨¤ª¤«)¤¤¯¤±¤³)", "¤¢¤¤¤¦¤¨¤ª¤«¤¤¯¤±¤³", 6, 12, 4);
+ x3(".*(¥Õ¥©)¥ó¡¦¥Þ(¥ó()¥·¥å¥¿)¥¤¥ó", "¥Õ¥©¥ó¡¦¥Þ¥ó¥·¥å¥¿¥¤¥ó", 10, 18, 2);
+ x2("(^¤¢)", "¤¢", 0, 2);
+ x3("(¤¢)|(¤¢)", "¤¤¤¢", 2, 4, 1);
+ x3("(^¤¢)|(¤¢)", "¤¤¤¢", 2, 4, 2);
+ x3("(¤¢?)", "¤¢¤¢¤¢", 0, 2, 1);
+ x3("(¤Þ*)", "¤Þ¤Þ¤Þ", 0, 6, 1);
+ x3("(¤È*)", "", 0, 0, 1);
+ x3("(¤ë+)", "¤ë¤ë¤ë¤ë¤ë¤ë¤ë", 0, 14, 1);
+ x3("(¤Õ+|¤Ø*)", "¤Õ¤Õ¤Õ¤Ø¤Ø", 0, 6, 1);
+ x3("(¤¢+|¤¤?)", "¤¤¤¤¤¤¤¢¤¢", 0, 2, 1);
+ x3("(¤¢¤¤¤¦)?", "¤¢¤¤¤¦", 0, 6, 1);
+ x3("(¤¢¤¤¤¦)*", "¤¢¤¤¤¦", 0, 6, 1);
+ x3("(¤¢¤¤¤¦)+", "¤¢¤¤¤¦", 0, 6, 1);
+ x3("(¤µ¤·¤¹|¤¢¤¤¤¦)+", "¤¢¤¤¤¦", 0, 6, 1);
+ x3("([¤Ê¤Ë¤Ì][¤«¤¤¯]|¤«¤¤¯)+", "¤«¤¤¯", 0, 6, 1);
+ x3("((?i:¤¢¤¤¤¦))", "¤¢¤¤¤¦", 0, 6, 1);
+ x3("((?m:¤¢.¤¦))", "¤¢\n¤¦", 0, 5, 1);
+ x3("((?=¤¢¤ó)¤¢)", "¤¢¤ó¤¤", 0, 2, 1);
+ x3("¤¢¤¤¤¦|(.¤¢¤¤¤¨)", "¤ó¤¢¤¤¤¨", 0, 8, 1);
+ x3("¤¢*(.)", "¤¢¤¢¤¢¤¢¤ó", 8, 10, 1);
+ x3("¤¢*?(.)", "¤¢¤¢¤¢¤¢¤ó", 0, 2, 1);
+ x3("¤¢*?(¤ó)", "¤¢¤¢¤¢¤¢¤ó", 8, 10, 1);
+ x3("[¤¤¤¦¤¨]¤¢*(.)", "¤¨¤¢¤¢¤¢¤¢¤ó", 10, 12, 1);
+ x3("(\\A¤¤¤¤)¤¦¤¦", "¤¤¤¤¤¦¤¦", 0, 4, 1);
+ n("(\\A¤¤¤¤)¤¦¤¦", "¤ó¤¤¤¤¤¦¤¦");
+ x3("(^¤¤¤¤)¤¦¤¦", "¤¤¤¤¤¦¤¦", 0, 4, 1);
+ n("(^¤¤¤¤)¤¦¤¦", "¤ó¤¤¤¤¤¦¤¦");
+ x3("¤í¤í(¤ë¤ë$)", "¤í¤í¤ë¤ë", 4, 8, 1);
+ n("¤í¤í(¤ë¤ë$)", "¤í¤í¤ë¤ë¤ë");
+ x2("(̵)\\1", "̵̵", 0, 4);
+ n("(̵)\\1", "̵Éð");
+ x2("(¶õ?)\\1", "¶õ¶õ", 0, 4);
+ x2("(¶õ??)\\1", "¶õ¶õ", 0, 0);
+ x2("(¶õ*)\\1", "¶õ¶õ¶õ¶õ¶õ", 0, 8);
+ x3("(¶õ*)\\1", "¶õ¶õ¶õ¶õ¶õ", 0, 4, 1);
+ x2("¤¢(¤¤*)\\1", "¤¢¤¤¤¤¤¤¤¤", 0, 10);
+ x2("¤¢(¤¤*)\\1", "¤¢¤¤", 0, 2);
+ x2("(¤¢*)(¤¤*)\\1\\2", "¤¢¤¢¤¢¤¤¤¤¤¢¤¢¤¢¤¤¤¤", 0, 20);
+ x2("(¤¢*)(¤¤*)\\2", "¤¢¤¢¤¢¤¤¤¤¤¤¤¤", 0, 14);
+ x3("(¤¢*)(¤¤*)\\2", "¤¢¤¢¤¢¤¤¤¤¤¤¤¤", 6, 10, 2);
+ x2("(((((((¤Ý*)¤Ú))))))¤Ô\\7", "¤Ý¤Ý¤Ý¤Ú¤Ô¤Ý¤Ý¤Ý", 0, 16);
+ x3("(((((((¤Ý*)¤Ú))))))¤Ô\\7", "¤Ý¤Ý¤Ý¤Ú¤Ô¤Ý¤Ý¤Ý", 0, 6, 7);
+ x2("(¤Ï)(¤Ò)(¤Õ)\\2\\1\\3", "¤Ï¤Ò¤Õ¤Ò¤Ï¤Õ", 0, 12);
+ x2("([¤-¤±])\\1", "¤¯¤¯", 0, 4);
+ x2("(\\w\\d\\s)\\1", "¤¢5 ¤¢5 ", 0, 8);
+ n("(\\w\\d\\s)\\1", "¤¢5 ¤¢5");
+ x2("(ï¡©|[¤¢-¤¦]{3})\\1", "ï¡©", 0, 8);
+ x2("...(ï¡©|[¤¢-¤¦]{3})\\1", "¤¢a¤¢Ã¯¡©Ã¯¡©", 0, 13);
+ x2("(ï¡©|[¤¢-¤¦]{3})\\1", "¤¦¤¤¤¦¤¦¤¤¤¦", 0, 12);
+ x2("(^¤³)\\1", "¤³¤³", 0, 4);
+ n("(^¤à)\\1", "¤á¤à¤à");
+ n("(¤¢$)\\1", "¤¢¤¢");
+ n("(¤¢¤¤\\Z)\\1", "¤¢¤¤");
+ x2("(¤¢*\\Z)\\1", "¤¢", 2, 2);
+ x2(".(¤¢*\\Z)\\1", "¤¤¤¢", 2, 4);
+ x3("(.(¤ä¤¤¤æ)\\2)", "z¤ä¤¤¤æ¤ä¤¤¤æ", 0, 13, 1);
+ x3("(.(..\\d.)\\2)", "¤¢12341234", 0, 10, 1);
+ x2("((?i:¤¢v¤º))\\1", "¤¢v¤º¤¢v¤º", 0, 10);
+ x2("(?<¶ò¤«>ÊÑ|\\(\\g<¶ò¤«>\\))", "((((((ÊÑ))))))", 0, 14);
+ x2("\\A(?:\\g<°¤_1>|\\g<±¾_2>|\\z½ªÎ» (?<°¤_1>´Ñ|¼«\\g<±¾_2>¼«)(?<±¾_2>ºß|Êî»§\\g<°¤_1>Êî»§))$", "Êî»§¼«Êî»§¼«ºß¼«Êî»§¼«Êî»§", 0, 26);
+ x2("[[¤Ò¤Õ]]", "¤Õ", 0, 2);
+ x2("[[¤¤¤ª¤¦]¤«]", "¤«", 0, 2);
+ n("[[^¤¢]]", "¤¢");
+ n("[^[¤¢]]", "¤¢");
+ x2("[^[^¤¢]]", "¤¢", 0, 2);
+ x2("[[¤«¤¤¯]&&¤¤¯]", "¤¯", 0, 2);
+ n("[[¤«¤¤¯]&&¤¤¯]", "¤«");
+ n("[[¤«¤¤¯]&&¤¤¯]", "¤±");
+ x2("[¤¢-¤ó&&¤¤-¤ò&&¤¦-¤ñ]", "¤ñ", 0, 2);
+ n("[^¤¢-¤ó&&¤¤-¤ò&&¤¦-¤ñ]", "¤ñ");
+ x2("[[^¤¢&&¤¢]&&¤¢-¤ó]", "¤¤", 0, 2);
+ n("[[^¤¢&&¤¢]&&¤¢-¤ó]", "¤¢");
+ x2("[[^¤¢-¤ó&&¤¤¤¦¤¨¤ª]&&[^¤¦-¤«]]", "¤", 0, 2);
+ n("[[^¤¢-¤ó&&¤¤¤¦¤¨¤ª]&&[^¤¦-¤«]]", "¤¤");
+ x2("[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]", "¤¦", 0, 2);
+ x2("[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]", "¤¨", 0, 2);
+ n("[^[^¤¢¤¤¤¦]&&[^¤¦¤¨¤ª]]", "¤«");
+ x2("[¤¢-&&-¤¢]", "-", 0, 1);
+ x2("[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]q-w]", "¤¨", 0, 2);
+ x2("[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]", "f", 0, 1);
+ x2("[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]", "g", 0, 1);
+ n("[^[^a-z¤¢¤¤¤¦]&&[^bcdefg¤¦¤¨¤ª]g-w]", "2");
+ fprintf(stdout, "\nRESULT SUCC: %d, FAIL: %d, ERROR: %d\n",
+ nsucc, nfail, nerror);
#ifndef POSIX_TEST
- regex_region_free(region, 1);
- regex_end();
+ onig_region_free(region, 1);
+ onig_end();
#endif
return 0;
+++ /dev/null
-#!/usr/local/bin/ruby -Ke
-# testconv.rb
-# Copyright (C) 2003 K.Kosako (kosako@sofnec.co.jp)
-
-WINDOWS = (ARGV.size > 0 && /^-win/i =~ ARGV[0])
-ARGV.shift if WINDOWS
-
-if WINDOWS
- REGCODE = 'REGCODE_SJIS'
- REGENC = 'REG_ENCODING_SJIS'
-else
- REGCODE = 'REGCODE_EUCJP'
- REGENC = 'REG_ENCODING_EUC_JP'
-end
-
-def conv_reg(s)
- s = s.gsub(/\\/, '\\\\\\\\') #'
- if (WINDOWS)
- s = s.gsub(/\?\?/, '?\\\\?') # escape ANSI trigraph
- end
- s
-end
-
-def conv_str(s)
- if (s[0] == ?')
- s = s[1..-2]
- return s.gsub(/\\/, '\\\\\\\\') #'
- else
- return s[1..-2]
- end
-end
-
-print(<<"EOS")
-/*
- * This program was generated by testconv.rb.
- */
-#include<stdio.h>
-
-#ifdef POSIX_TEST
-#include "onigposix.h"
-#else
-#include "oniguruma.h"
-#endif
-
-static int nsucc = 0;
-static int nfail = 0;
-
-#ifndef POSIX_TEST
-static RegRegion* region;
-#endif
-
-static void xx(char* pattern, char* str, int from, int to, int mem, int not)
-{
- int r;
-
-#ifdef POSIX_TEST
- regex_t reg;
- char buf[200];
- regmatch_t pmatch[20];
-
- r = regcomp(®, pattern, REG_EXTENDED | REG_NEWLINE);
- if (r) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\\n", buf);
- exit(-1);
- }
-
- r = regexec(®, str, reg.re_nsub + 1, pmatch, 0);
- if (r != 0 && r != REG_NOMATCH) {
- regerror(r, ®, buf, sizeof(buf));
- fprintf(stderr, "ERROR: %s\\n", buf);
- exit(-1);
- }
-
- if (r == REG_NOMATCH) {
- if (not) {
- fprintf(stdout, "OK(N): /%s/ '%s'\\n", pattern, str);
- nsucc++;
- }
- else {
- fprintf(stdout, "FAIL: /%s/ '%s'\\n", pattern, str);
- nfail++;
- }
- }
- else {
- if (not) {
- fprintf(stdout, "FAIL(N): /%s/ '%s'\\n", pattern, str);
- nfail++;
- }
- else {
- if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {
- fprintf(stdout, "OK: /%s/ '%s'\\n", pattern, str);
- nsucc++;
- }
- else {
- fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\\n", pattern, str,
- from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);
- nfail++;
- }
- }
- }
- regfree(®);
-
-#else
- regex_t* reg;
- RegErrorInfo einfo;
-
- r = regex_new(®, (UChar* )pattern, (UChar* )(pattern + strlen(pattern)),
- REG_OPTION_DEFAULT, #{REGCODE}, REG_SYNTAX_DEFAULT, &einfo);
- if (r) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r, &einfo);
- fprintf(stderr, "ERROR: %s\\n", s);
- exit(-1);
- }
-
- r = regex_search(reg, (UChar* )str, (UChar* )(str + strlen(str)),
- (UChar* )str, (UChar* )(str + strlen(str)),
- region, REG_OPTION_NONE);
- if (r < REG_MISMATCH) {
- char s[REG_MAX_ERROR_MESSAGE_LEN];
- regex_error_code_to_str(s, r);
- fprintf(stderr, "ERROR: %s\\n", s);
- exit(-1);
- }
-
- if (r == REG_MISMATCH) {
- if (not) {
- fprintf(stdout, "OK(N): /%s/ '%s'\\n", pattern, str);
- nsucc++;
- }
- else {
- fprintf(stdout, "FAIL: /%s/ '%s'\\n", pattern, str);
- nfail++;
- }
- }
- else {
- if (not) {
- fprintf(stdout, "FAIL(N): /%s/ '%s'\\n", pattern, str);
- nfail++;
- }
- else {
- if (region->beg[mem] == from && region->end[mem] == to) {
- fprintf(stdout, "OK: /%s/ '%s'\\n", pattern, str);
- nsucc++;
- }
- else {
- fprintf(stdout, "FAIL: /%s/ '%s' %d-%d : %d-%d\\n", pattern, str,
- from, to, region->beg[mem], region->end[mem]);
- nfail++;
- }
- }
- }
- regex_free(reg);
-#endif
-}
-
-static void x2(char* pattern, char* str, int from, int to)
-{
- xx(pattern, str, from, to, 0, 0);
-}
-
-static void x3(char* pattern, char* str, int from, int to, int mem)
-{
- xx(pattern, str, from, to, mem, 0);
-}
-
-static void n(char* pattern, char* str)
-{
- xx(pattern, str, 0, 0, 0, 1);
-}
-
-extern int main(int argc, char* argv[])
-{
-#ifdef POSIX_TEST
- reg_set_encoding(#{REGENC});
-#else
- region = regex_region_new();
-#endif
-
-EOS
-
-CM = '\s*,\s*'
-RX2 = %r{^x\(/([^\/]*)/#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)\)$}
-RI2 = %r{^i\(/([^\/]*)/#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)\)}
-RX3 = %r{^x\(/([^\/]*)/#{CM}('[^']*'|"[^"]*")#{CM}(\S+)#{CM}(\S+)#{CM}(\S+)\)$}
-RN = %r{^n\(/([^\/]*)/#{CM}('[^']*'|"[^"]*")\)$} #'
-
-while line = gets()
- if (m = RX2.match(line))
- reg = conv_reg(m[1])
- str = conv_str(m[2])
- printf(" x2(\"%s\", \"%s\", %s, %s);\n", reg, str, m[3], m[4])
- elsif (m = RI2.match(line))
- reg = conv_reg(m[1])
- str = conv_str(m[2])
- printf(" x2(\"%s\", \"%s\", %s, %s);\n", reg, str, m[3], m[4])
- elsif (m = RX3.match(line))
- reg = conv_reg(m[1])
- str = conv_str(m[2])
- printf(" x3(\"%s\", \"%s\", %s, %s, %s);\n", reg, str, m[3], m[4], m[5])
- elsif (m = RN.match(line))
- reg = conv_reg(m[1])
- str = conv_str(m[2])
- printf(" n(\"%s\", \"%s\");\n", reg, str)
- else
-
- end
-end
-
-print(<<'EOS')
- fprintf(stdout, "\nRESULT SUCC: %d, FAIL: %d\n", nsucc, nfail);
-
-#ifndef POSIX_TEST
- regex_region_free(region, 1);
- regex_end();
-#endif
-
- return 0;
-}
-EOS
-
-# END OF SCRIPT
+++ /dev/null
-# Oniguruma Makefile for Win32
-
-product_name = oniguruma
-
-CPPFLAGS =
-CFLAGS = -O2 -nologo
-LDFLAGS =
-LOADLIBES =
-ARLIB = lib
-ARLIB_FLAGS = -nologo
-ARDLL = cl
-ARDLL_FLAGS = -nologo -LD $(LINKFLAGS) -dll
-LINKFLAGS = -link -incremental:no -pdb:none
-
-INSTALL = install -c
-CP = copy
-CC = cl
-DEFS = -DHAVE_CONFIG_H -DNOT_RUBY -DEXPORT
-RUBYDIR = ..
-
-subdirs =
-
-libbase = onig
-libname = $(libbase)_s.lib
-dllname = $(libbase).dll
-dlllib = $(libbase).lib
-
-onigheaders = oniguruma.h regint.h regparse.h
-posixheaders = onigposix.h
-headers = $(posixheaders) $(onigheaders)
-
-onigobjs = reggnu.obj regerror.obj regparse.obj regcomp.obj regexec.obj
-posixobjs = regposix.obj regposerr.obj
-libobjs = $(onigobjs) $(posixobjs)
-
-onigsources = regerror.c regparse.c regcomp.c regexec.c reggnu.c
-posixsources = regposix.c regposerr.c
-libsources = $(posixsources) $(onigsources)
-rubysources = regex.c $(onigsources)
-
-patchfiles = re.c.168.patch re.c.180.patch
-distfiles = README COPYING INSTALL-RUBY HISTORY \
- Makefile.in configure.in config.h.in configure \
- $(headers) $(libsources) regex.c $(patchfiles) \
- test.rb testconv.rb
-testc = testc
-testp = testp
-
-makeargs = $(MFLAGS) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' CC='$(CC)'
-
-.SUFFIXES:
-.SUFFIXES: .obj .c .h .ps .dvi .info .texinfo
-
-.c.obj:
- $(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) /I. /c $<
-
-# targets
-default: all
-
-all: $(libname) $(dllname)
-
-$(libname): $(libobjs)
- $(ARLIB) $(ARLIB_FLAGS) -out:$@ $(libobjs)
-
-$(dllname): $(libobjs)
- $(ARDLL) $(libobjs) -Fe$@ $(ARDLL_FLAGS)
-
-regparse.obj: regparse.c $(onigheaders) config.h
-regcomp.obj: regcomp.c $(onigheaders) config.h
-regexec.obj: regexec.c regint.h oniguruma.h config.h
-reggnu.obj: reggnu.c regint.h oniguruma.h config.h
-regerror.obj: regerror.c regint.h oniguruma.h config.h
-regposix.obj: regposix.c $(posixheaders) oniguruma.h config.h
-regposerr.obj: regposerr.c $(posixheaders) config.h
-
-# Ruby test
-rtest:
- $(RUBYDIR)\win32\ruby -w -Ke test.rb
-
-# C library test
-ctest: $(testc)
- .\$(testc)
-
-# POSIX C library test
-ptest: $(testp)
- .\$(testp)
-
-$(testc): $(testc).c $(libname)
- $(CC) -nologo -o $(testc) $(testc).c $(libname)
-
-$(testp): $(testc).c $(dlllib)
- $(CC) -nologo -DPOSIX_TEST -DIMPORT -o $(testp) $(testc).c $(dlllib)
-
-clean:
- del *.obj *.lib *.exp *.dll $(testp).exe $(testc).exe $(testc).obj
-
-
-16: cpruby
- patch -d $(RUBYDIR) -p0 < re.c.168.patch
-
-18: cpruby
- patch -d $(RUBYDIR) -p0 < re.c.180.patch
-
-# backup file suffix
-SORIG = ruby_orig
-
-cpruby:
- $(CP) $(RUBYDIR)\regex.c $(RUBYDIR)\regex.c.$(SORIG)
- $(CP) $(RUBYDIR)\regex.h $(RUBYDIR)\regex.h.$(SORIG)
- $(CP) $(RUBYDIR)\re.c $(RUBYDIR)\re.c.$(SORIG)
-# $(rubysources)
- $(CP) regex.c $(RUBYDIR)
- $(CP) regerror.c $(RUBYDIR)
- $(CP) regparse.c $(RUBYDIR)
- $(CP) regcomp.c $(RUBYDIR)
- $(CP) regexec.c $(RUBYDIR)
- $(CP) reggnu.c $(RUBYDIR)
-# $(onigheaders)
- $(CP) oniguruma.h $(RUBYDIR)\regex.h
- $(CP) regint.h $(RUBYDIR)
- $(CP) regparse.h $(RUBYDIR)
-
-rback:
- $(CP) $(RUBYDIR)\regex.c.$(SORIG) $(RUBYDIR)\regex.c
- $(CP) $(RUBYDIR)\regex.h.$(SORIG) $(RUBYDIR)\regex.h
- $(CP) $(RUBYDIR)\re.c.$(SORIG) $(RUBYDIR)\re.c
-
-samples:
- $(CC) $(CFLAGS) -I. -DIMPORT -o simple sample\simple.c $(dlllib)
- $(CC) $(CFLAGS) -I. -DIMPORT -o posix sample\posix.c $(dlllib)
- $(CC) $(CFLAGS) -I. -DIMPORT -o names sample\names.c $(dlllib)
+++ /dev/null
-#define STDC_HEADERS 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_SYS_STAT_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRING_H 1
-#define HAVE_MEMORY_H 1
-#define HAVE_FLOAT_H 1
-#define HAVE_OFF_T 1
-#define SIZEOF_INT 4
-#define SIZEOF_SHORT 2
-#define SIZEOF_LONG 4
-#define SIZEOF_LONG_LONG 0
-#define SIZEOF___INT64 8
-#define SIZEOF_OFF_T 4
-#define SIZEOF_VOIDP 4
-#define SIZEOF_FLOAT 4
-#define SIZEOF_DOUBLE 8
-#define HAVE_PROTOTYPES 1
-#define TOKEN_PASTE(x,y) x##y
-#define HAVE_STDARG_PROTOTYPES 1
-#ifndef NORETURN
-#if _MSC_VER > 1100
-#define NORETURN(x) __declspec(noreturn) x
-#else
-#define NORETURN(x) x
-#endif
-#endif
-#define HAVE_DECL_SYS_NERR 1
-#define STDC_HEADERS 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STRING_H 1
-#define HAVE_LIMITS_H 1
-#define HAVE_FCNTL_H 1
-#define HAVE_SYS_UTIME_H 1
-#define HAVE_MEMORY_H 1
-#define uid_t int
-#define gid_t int
-#define HAVE_STRUCT_STAT_ST_RDEV 1
-#define HAVE_ST_RDEV 1
-#define GETGROUPS_T int
-#define RETSIGTYPE void
-#define HAVE_ALLOCA 1
-#define HAVE_DUP2 1
-#define HAVE_MEMCMP 1
-#define HAVE_MEMMOVE 1
-#define HAVE_MKDIR 1
-#define HAVE_STRCASECMP 1
-#define HAVE_STRNCASECMP 1
-#define HAVE_STRERROR 1
-#define HAVE_STRFTIME 1
-#define HAVE_STRCHR 1
-#define HAVE_STRSTR 1
-#define HAVE_STRTOD 1
-#define HAVE_STRTOL 1
-#define HAVE_STRTOUL 1
-#define HAVE_FLOCK 1
-#define HAVE_VSNPRINTF 1
-#define HAVE_FINITE 1
-#define HAVE_FMOD 1
-#define HAVE_FREXP 1
-#define HAVE_HYPOT 1
-#define HAVE_MODF 1
-#define HAVE_WAITPID 1
-#define HAVE_CHSIZE 1
-#define HAVE_TIMES 1
-#define HAVE__SETJMP 1
-#define HAVE_TELLDIR 1
-#define HAVE_SEEKDIR 1
-#define HAVE_MKTIME 1
-#define HAVE_COSH 1
-#define HAVE_SINH 1
-#define HAVE_TANH 1
-#define HAVE_EXECVE 1
-#define HAVE_TZNAME 1
-#define HAVE_DAYLIGHT 1
-#define SETPGRP_VOID 1
-#define inline __inline
-#define NEED_IO_SEEK_BETWEEN_RW 1
-#define RSHIFT(x,y) ((x)>>(int)y)
-#define FILE_COUNT _cnt
-#define FILE_READPTR _ptr
-#define DEFAULT_KCODE KCODE_NONE
-#define DLEXT ".so"
-#define DLEXT2 ".dll"
/* {{{ static void php_mb_regex_free_cache() */
static void php_mb_regex_free_cache(php_mb_regex_t **pre)
{
- php_mb_regex_free(*pre);
+ onig_free(*pre);
}
/* }}} */
/* {{{ _php_mb_regex_globals_ctor */
void _php_mb_regex_globals_ctor(zend_mbstring_globals *pglobals TSRMLS_DC)
{
- MBSTRG(default_mbctype) = REGCODE_EUCJP;
- MBSTRG(current_mbctype) = REGCODE_EUCJP;
+ MBSTRG(default_mbctype) = ONIG_ENCODING_EUC_JP;
+ MBSTRG(current_mbctype) = ONIG_ENCODING_EUC_JP;
zend_hash_init(&(MBSTRG(ht_rc)), 0, NULL, (void (*)(void *)) php_mb_regex_free_cache, 1);
MBSTRG(search_str) = (zval*) NULL;
MBSTRG(search_re) = (php_mb_regex_t*)NULL;
MBSTRG(search_pos) = 0;
- MBSTRG(search_regs) = (php_mb_reg_region*)NULL;
- MBSTRG(regex_default_options) = RE_OPTION_POSIXLINE;
- MBSTRG(regex_default_syntax) = REG_SYNTAX_RUBY;
+ MBSTRG(search_regs) = (OnigRegion*)NULL;
+ MBSTRG(regex_default_options) = ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE;
+ MBSTRG(regex_default_syntax) = ONIG_SYNTAX_RUBY;
}
/* }}} */
MBSTRG(search_pos) = 0;
if (MBSTRG(search_regs) != NULL) {
- php_mb_regex_region_free(MBSTRG(search_regs), 1);
- MBSTRG(search_regs) = (php_mb_reg_region *)NULL;
+ onig_region_free(MBSTRG(search_regs), 1);
+ MBSTRG(search_regs) = (OnigRegion *)NULL;
}
zend_hash_clean(&MBSTRG(ht_rc));
/*
* encoding name resolver
*/
+
+/* {{{ encoding name map */
+typedef struct _php_mb_regex_enc_name_map_t {
+ const char *names;
+ OnigEncoding code;
+} php_mb_regex_enc_name_map_t;
+
+php_mb_regex_enc_name_map_t enc_name_map[] ={
+ {
+ "EUC-JP\0EUCJP\0X-EUC-JP\0UJIS\0EUCJP\0EUCJP-WIN\0",
+ ONIG_ENCODING_EUC_JP
+ },
+ {
+ "UTF-8\0UTF8\0",
+ ONIG_ENCODING_UTF8
+ },
+ {
+ "SJIS\0CP932\0MS932\0SHIFT_JIS\0SJIS-WIN\0WINDOWS-31J\0",
+ ONIG_ENCODING_SJIS
+ },
+ {
+ "BIG5\0BIG-5\0BIGFIVE\0CN-BIG5\0BIG-FIVE\0",
+ ONIG_ENCODING_BIG5
+ },
+ {
+ "EUC-CN\0EUCCN\0EUC_CN\0GB-2312\0GB2312\0",
+ ONIG_ENCODING_EUC_CN
+ },
+ {
+ "EUC-TW\0EUCTW\0EUC_TW\0",
+ ONIG_ENCODING_EUC_TW
+ },
+ {
+ "EUC-KR\0EUCKR\0EUC_KR\0",
+ ONIG_ENCODING_EUC_KR
+ },
+ {
+ "KOI8\0KOI-8\0",
+ ONIG_ENCODING_KOI8
+ },
+ {
+ "KOI8R\0KOI8-R\0KOI-8R\0",
+ ONIG_ENCODING_KOI8_R
+ },
+ {
+ "ISO-8859-1\0ISO8859-1\0ISO_8859_1\0ISO8859_1\0",
+ ONIG_ENCODING_ISO_8859_1
+ },
+ {
+ "ISO-8859-2\0ISO8859-2\0ISO_8859_2\0ISO8859_2\0",
+ ONIG_ENCODING_ISO_8859_2
+ },
+ {
+ "ISO-8859-3\0ISO8859-3\0ISO_8859_3\0ISO8859_3\0",
+ ONIG_ENCODING_ISO_8859_3
+ },
+ {
+ "ISO-8859-4\0ISO8859-4\0ISO_8859_4\0ISO8859_4\0",
+ ONIG_ENCODING_ISO_8859_4
+ },
+ {
+ "ISO-8859-5\0ISO8859-5\0ISO_8859_5\0ISO8859_5\0",
+ ONIG_ENCODING_ISO_8859_5
+ },
+ {
+ "ISO-8859-6\0ISO8859-6\0ISO_8859_6\0ISO8859_6\0",
+ ONIG_ENCODING_ISO_8859_6
+ },
+ {
+ "ISO-8859-7\0ISO8859-7\0ISO_8859_7\0ISO8859_7\0",
+ ONIG_ENCODING_ISO_8859_7
+ },
+ {
+ "ISO-8859-8\0ISO8859-8\0ISO_8859_8\0ISO8859_8\0",
+ ONIG_ENCODING_ISO_8859_8
+ },
+ {
+ "ISO-8859-9\0ISO8859-9\0ISO_8859_9\0ISO8859_9\0",
+ ONIG_ENCODING_ISO_8859_9
+ },
+ {
+ "ISO-8859-10\0ISO8859-10\0ISO_8859_10\0ISO8859_10\0",
+ ONIG_ENCODING_ISO_8859_10
+ },
+ {
+ "ISO-8859-11\0ISO8859-11\0ISO_8859_11\0ISO8859_11\0",
+ ONIG_ENCODING_ISO_8859_11
+ },
+ {
+ "ISO-8859-13\0ISO8859-13\0ISO_8859_13\0ISO8859_13\0",
+ ONIG_ENCODING_ISO_8859_13
+ },
+ {
+ "ISO-8859-14\0ISO8859-14\0ISO_8859_14\0ISO8859_14\0",
+ ONIG_ENCODING_ISO_8859_14
+ },
+ {
+ "ISO-8859-15\0ISO8859-15\0ISO_8859_15\0ISO8859_15\0",
+ ONIG_ENCODING_ISO_8859_15
+ },
+ {
+ "ISO-8859-16\0ISO8859-16\0ISO_8859_16\0ISO8859_16\0",
+ ONIG_ENCODING_ISO_8859_16
+ },
+ {
+ "ASCII\0US-ASCII\0US_ASCII\0ISO646\0",
+ ONIG_ENCODING_ASCII
+ },
+ { NULL, ONIG_ENCODING_UNDEF }
+};
+/* }}} */
+
/* {{{ php_mb_regex_name2mbctype */
-php_mb_reg_char_encoding php_mb_regex_name2mbctype(const char *pname)
+OnigEncoding php_mb_regex_name2mbctype(const char *pname)
{
- php_mb_reg_char_encoding mbctype;
-
- mbctype = REGCODE_UNDEF;
- if (pname != NULL) {
- if (strcasecmp("EUC-JP", pname) == 0
- || strcasecmp("X-EUC-JP", pname) == 0
- || strcasecmp("UJIS", pname) == 0
- || strcasecmp("EUCJP", pname) == 0
- || strcasecmp("EUC_JP", pname) == 0
- || strcasecmp("EUCJP-WIN", pname) == 0) {
- mbctype = REGCODE_EUCJP;
- } else if (strcasecmp("UTF-8", pname) == 0
- || strcasecmp("UTF8", pname) == 0) {
- mbctype = REGCODE_UTF8;
- } else if (strcasecmp("SJIS", pname) == 0
- || strcasecmp("CP932", pname) == 0
- || strcasecmp("MS932", pname) == 0
- || strcasecmp("SHIFT_JIS", pname) == 0
- || strcasecmp("SJIS-WIN", pname) == 0) {
- mbctype = REGCODE_SJIS;
- } else if (strcasecmp("ASCII", pname) == 0) {
- mbctype = REGCODE_ASCII;
+ const char *p;
+ php_mb_regex_enc_name_map_t *mapping;
+
+ if (pname == NULL) {
+ return ONIG_ENCODING_UNDEF;
+ }
+
+ for (mapping = enc_name_map; mapping->names != NULL; mapping++) {
+ for (p = mapping->names; *p != '\0'; p += (strlen(p) + 1)) {
+ if (strcasecmp(p, pname) == 0) {
+ return mapping->code;
+ }
}
}
- return mbctype;
+ return ONIG_ENCODING_UNDEF;
}
/* }}} */
/* {{{ php_mbregex_mbctype2name */
-const char *php_mb_regex_mbctype2name(php_mb_reg_char_encoding mbctype)
+const char *php_mb_regex_mbctype2name(OnigEncoding mbctype)
{
- const char *p = NULL;
-
- if (mbctype == REGCODE_EUCJP) {
- p = "EUC-JP";
- } else if(mbctype == REGCODE_UTF8) {
- p = "UTF-8";
- } else if(mbctype == REGCODE_SJIS) {
- p = "SJIS";
- } else if(mbctype == REGCODE_ASCII) {
- p = "ascii";
+ php_mb_regex_enc_name_map_t *mapping;
+
+ for (mapping = enc_name_map; mapping->names != NULL; mapping++) {
+ if (mapping->code == mbctype) {
+ return mapping->names;
+ }
}
- return p;
+
+ return NULL;
}
/* }}} */
* regex cache
*/
/* {{{ php_mbregex_compile_pattern */
-static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patlen, php_mb_reg_option_type options, php_mb_reg_char_encoding enc, php_mb_reg_syntax_type *syntax TSRMLS_DC)
+static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patlen, OnigOptionType options, OnigEncoding enc, OnigSyntaxType *syntax TSRMLS_DC)
{
int err_code = 0;
int found = 0;
php_mb_regex_t *retval = NULL, **rc = NULL;
- php_mb_reg_error_info err_info;
- UChar err_str[REG_MAX_ERROR_MESSAGE_LEN];
+ OnigErrorInfo err_info;
+ UChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
found = zend_hash_find(&MBSTRG(ht_rc), (char *)pattern, patlen+1, (void **) &rc);
if (found == FAILURE || (*rc)->options != options || (*rc)->enc != enc || (*rc)->syntax != syntax) {
- if ((err_code = php_mb_regex_new(&retval, (UChar *)pattern, (UChar *)(pattern + patlen), options, enc, syntax, &err_info)) != REG_NORMAL) {
- php_mb_regex_error_code_to_str(err_str, err_code, err_info);
+ if ((err_code = onig_new(&retval, (UChar *)pattern, (UChar *)(pattern + patlen), options, enc, syntax, &err_info)) != ONIG_NORMAL) {
+ onig_error_code_to_str(err_str, err_code, err_info);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex compile err: %s", err_str);
retval = NULL;
goto out;
/* }}} */
/* {{{ _php_mb_regex_get_option_string */
-static size_t _php_mb_regex_get_option_string(char *str, size_t len, php_mb_reg_option_type option, php_mb_reg_syntax_type *syntax)
+static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionType option, OnigSyntaxType *syntax)
{
size_t len_left = len;
size_t len_req = 0;
char *p = str;
char c;
- if ((option & RE_OPTION_IGNORECASE) != 0) {
+ if ((option & ONIG_OPTION_IGNORECASE) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 'i';
++len_req;
}
- if ((option & RE_OPTION_EXTENDED) != 0) {
+ if ((option & ONIG_OPTION_EXTEND) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 'x';
++len_req;
}
- if ((option & RE_OPTION_POSIXLINE) == RE_OPTION_POSIXLINE) {
+ if ((option & (ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE)) ==
+ (ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE)) {
if (len_left > 0) {
--len_left;
*(p++) = 'p';
}
++len_req;
} else {
- if ((option & RE_OPTION_MULTILINE) != 0) {
+ if ((option & ONIG_OPTION_MULTILINE) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 'm';
++len_req;
}
- if ((option & RE_OPTION_SINGLELINE) != 0) {
+ if ((option & ONIG_OPTION_SINGLELINE) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 's';
++len_req;
}
}
- if ((option & RE_OPTION_LONGEST) != 0) {
+ if ((option & ONIG_OPTION_FIND_LONGEST) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 'l';
}
++len_req;
}
- if ((option & REG_OPTION_FIND_NOT_EMPTY) != 0) {
+ if ((option & ONIG_OPTION_FIND_NOT_EMPTY) != 0) {
if (len_left > 0) {
--len_left;
*(p++) = 'n';
c = 0;
- if (syntax == REG_SYNTAX_JAVA) {
+ if (syntax == ONIG_SYNTAX_JAVA) {
c = 'j';
- } else if (syntax == REG_SYNTAX_GNU_REGEX) {
+ } else if (syntax == ONIG_SYNTAX_GNU_REGEX) {
c = 'u';
- } else if (syntax == REG_SYNTAX_GREP) {
+ } else if (syntax == ONIG_SYNTAX_GREP) {
c = 'g';
- } else if (syntax == REG_SYNTAX_EMACS) {
+ } else if (syntax == ONIG_SYNTAX_EMACS) {
c = 'c';
- } else if (syntax == REG_SYNTAX_RUBY) {
+ } else if (syntax == ONIG_SYNTAX_RUBY) {
c = 'r';
- } else if (syntax == REG_SYNTAX_PERL) {
+ } else if (syntax == ONIG_SYNTAX_PERL) {
c = 'z';
- } else if (syntax == REG_SYNTAX_POSIX_BASIC) {
+ } else if (syntax == ONIG_SYNTAX_POSIX_BASIC) {
c = 'b';
- } else if (syntax == REG_SYNTAX_POSIX_EXTENDED) {
+ } else if (syntax == ONIG_SYNTAX_POSIX_EXTENDED) {
c = 'd';
}
/* {{{ _php_mb_regex_init_options */
static void
-_php_mb_regex_init_options(const char *parg, int narg, php_mb_reg_option_type *option, php_mb_reg_syntax_type **syntax, int *eval)
+_php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, OnigSyntaxType **syntax, int *eval)
{
int n;
char c;
int optm = 0;
- *syntax = REG_SYNTAX_RUBY;
+ *syntax = ONIG_SYNTAX_RUBY;
if (parg != NULL) {
n = 0;
c = parg[n++];
switch (c) {
case 'i':
- optm |= RE_OPTION_IGNORECASE;
+ optm |= ONIG_OPTION_IGNORECASE;
break;
case 'x':
- optm |= RE_OPTION_EXTENDED;
+ optm |= ONIG_OPTION_EXTEND;
break;
case 'm':
- optm |= RE_OPTION_MULTILINE;
+ optm |= ONIG_OPTION_MULTILINE;
break;
case 's':
- optm |= RE_OPTION_SINGLELINE;
+ optm |= ONIG_OPTION_SINGLELINE;
break;
case 'p':
- optm |= RE_OPTION_POSIXLINE;
+ optm |= ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE;
break;
case 'l':
- optm |= RE_OPTION_LONGEST;
+ optm |= ONIG_OPTION_FIND_LONGEST;
break;
case 'n':
- optm |= REG_OPTION_FIND_NOT_EMPTY;
+ optm |= ONIG_OPTION_FIND_NOT_EMPTY;
break;
case 'j':
- *syntax = REG_SYNTAX_JAVA;
+ *syntax = ONIG_SYNTAX_JAVA;
break;
case 'u':
- *syntax = REG_SYNTAX_GNU_REGEX;
+ *syntax = ONIG_SYNTAX_GNU_REGEX;
break;
case 'g':
- *syntax = REG_SYNTAX_GREP;
+ *syntax = ONIG_SYNTAX_GREP;
break;
case 'c':
- *syntax = REG_SYNTAX_EMACS;
+ *syntax = ONIG_SYNTAX_EMACS;
break;
case 'r':
- *syntax = REG_SYNTAX_RUBY;
+ *syntax = ONIG_SYNTAX_RUBY;
break;
case 'z':
- *syntax = REG_SYNTAX_PERL;
+ *syntax = ONIG_SYNTAX_PERL;
break;
case 'b':
- *syntax = REG_SYNTAX_POSIX_BASIC;
+ *syntax = ONIG_SYNTAX_POSIX_BASIC;
break;
case 'd':
- *syntax = REG_SYNTAX_POSIX_EXTENDED;
+ *syntax = ONIG_SYNTAX_POSIX_EXTENDED;
break;
case 'e':
if (eval != NULL) *eval = 1;
PHP_FUNCTION(mb_regex_encoding)
{
zval **arg1;
- php_mb_reg_char_encoding mbctype;
+ OnigEncoding mbctype;
if (ZEND_NUM_ARGS() == 0) {
const char *retval = php_mb_regex_mbctype2name(MBSTRG(current_mbctype));
char *string;
int string_len;
php_mb_regex_t *re;
- php_mb_reg_region *regs = NULL;
- int i, match_len, option, beg, end;
+ OnigRegion *regs = NULL;
+ int i, match_len, beg, end;
+ OnigOptionType options;
char *str;
array = NULL;
RETURN_FALSE;
}
- option = MBSTRG(regex_default_options);
+ options = MBSTRG(regex_default_options);
if (icase) {
- option |= RE_OPTION_IGNORECASE;
+ options |= ONIG_OPTION_IGNORECASE;
}
/* compile the regular expression from the supplied regex */
arg_pattern = &tmp;
/* don't bother doing an extended regex with just a number */
}
- re = php_mbregex_compile_pattern(Z_STRVAL_P(arg_pattern), Z_STRLEN_P(arg_pattern), option, MBSTRG(current_mbctype), MBSTRG(regex_default_syntax) TSRMLS_CC);
+ re = php_mbregex_compile_pattern(Z_STRVAL_P(arg_pattern), Z_STRLEN_P(arg_pattern), options, MBSTRG(current_mbctype), MBSTRG(regex_default_syntax) TSRMLS_CC);
if (re == NULL) {
RETVAL_FALSE;
goto out;
}
- regs = php_mb_regex_region_new();
+ regs = onig_region_new();
/* actually execute the regular expression */
- if (php_mb_regex_search(re, (UChar *)string, (UChar *)(string + string_len), string, (UChar *)(string + string_len), regs, 0) < 0) {
+ if (onig_search(re, (UChar *)string, (UChar *)(string + string_len), string, (UChar *)(string + string_len), regs, 0) < 0) {
RETVAL_FALSE;
goto out;
}
RETVAL_LONG(match_len);
out:
if (regs != NULL) {
- php_mb_regex_region_free(regs, 1);
+ onig_region_free(regs, 1);
}
if (arg_pattern == &tmp) {
zval_dtor(&tmp);
/* }}} */
/* {{{ _php_mb_regex_ereg_replace_exec */
-static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, int option)
+static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOptionType options)
{
zval *arg_pattern_zval;
char *p;
php_mb_regex_t *re;
- php_mb_reg_syntax_type *syntax;
- php_mb_reg_region *regs = NULL;
+ OnigSyntaxType *syntax;
+ OnigRegion *regs = NULL;
smart_str out_buf = { 0 };
smart_str eval_buf = { 0 };
smart_str *pbuf;
}
if (option_str != NULL) {
- _php_mb_regex_init_options(option_str, option_str_len, &option, &syntax, &eval);
+ _php_mb_regex_init_options(option_str, option_str_len, &options, &syntax, &eval);
} else {
- option |= MBSTRG(regex_default_options);
+ options |= MBSTRG(regex_default_options);
syntax = MBSTRG(regex_default_syntax);
}
}
arg_pattern_len = 1;
}
/* create regex pattern buffer */
- re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBSTRG(current_mbctype), syntax TSRMLS_CC);
+ re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, options, MBSTRG(current_mbctype), syntax TSRMLS_CC);
if (re == NULL) {
RETURN_FALSE;
}
err = 0;
pos = string;
string_lim = (UChar*)(string + string_len);
- regs = php_mb_regex_region_new();
+ regs = onig_region_new();
while (err >= 0) {
- err = php_mb_regex_search(re, (UChar *)string, (UChar *)string_lim, pos, (UChar *)string_lim, regs, 0);
+ err = onig_search(re, (UChar *)string, (UChar *)string_lim, pos, (UChar *)string_lim, regs, 0);
if (err <= -2) {
- UChar err_str[REG_MAX_ERROR_MESSAGE_LEN];
- php_mb_regex_error_code_to_str(err_str, err);
+ UChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str(err_str, err);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in php_mbereg_replace_exec(): %s", err_str);
break;
}
smart_str_appendl(&out_buf, pos, string_lim - pos);
}
}
- php_mb_regex_region_free(regs, 0);
+ onig_region_free(regs, 0);
}
if (description) {
efree(description);
}
if (regs != NULL) {
- php_mb_regex_region_free(regs, 1);
+ onig_region_free(regs, 1);
}
smart_str_free(&eval_buf);
Case insensitive replace regular expression for multibyte string */
PHP_FUNCTION(mb_eregi_replace)
{
- _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, RE_OPTION_IGNORECASE);
+ _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, ONIG_OPTION_IGNORECASE);
}
/* }}} */
char *arg_pattern;
int arg_pattern_len;
php_mb_regex_t *re;
- php_mb_reg_region *regs = NULL;
+ OnigRegion *regs = NULL;
char *string;
UChar *pos;
int string_len;
pos = (UChar *)string;
err = 0;
- regs = php_mb_regex_region_new();
+ regs = onig_region_new();
/* churn through str, generating array entries as we go */
while ((--count != 0) &&
- (err = php_mb_regex_search(re, (UChar *)string, (UChar *)(string + string_len), pos, (UChar *)(string + string_len), regs, 0)) >= 0) {
+ (err = onig_search(re, (UChar *)string, (UChar *)(string + string_len), pos, (UChar *)(string + string_len), regs, 0)) >= 0) {
if (regs->beg[0] == regs->end[0]) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty regular expression");
break;
if (count < 0) {
count = 0;
}
- php_mb_regex_region_free(regs, 0);
+ onig_region_free(regs, 0);
}
- php_mb_regex_region_free(regs, 1);
+ onig_region_free(regs, 1);
/* see if we encountered an error */
if (err <= -2) {
- UChar err_str[REG_MAX_ERROR_MESSAGE_LEN];
- php_mb_regex_error_code_to_str(err_str, err);
+ UChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str(err_str, err);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in mbsplit(): %s", err_str);
zval_dtor(return_value);
RETURN_FALSE;
int string_len;
php_mb_regex_t *re;
- php_mb_reg_syntax_type *syntax;
+ OnigSyntaxType *syntax;
int option = 0, err;
{
}
/* match */
- err = php_mb_regex_match(re, (UChar *)string, (UChar *)(string + string_len), (UChar *)string, NULL, 0);
+ err = onig_match(re, (UChar *)string, (UChar *)(string + string_len), (UChar *)string, NULL, 0);
if (err >= 0) {
RETVAL_TRUE;
} else {
zval **arg_pattern, **arg_options;
int n, i, err, pos, len, beg, end, option;
UChar *str;
- php_mb_reg_syntax_type *syntax;
+ OnigSyntaxType *syntax;
option = MBSTRG(regex_default_options);
switch (ZEND_NUM_ARGS()) {
}
if (MBSTRG(search_regs)) {
- php_mb_regex_region_free(MBSTRG(search_regs), 1);
+ onig_region_free(MBSTRG(search_regs), 1);
}
- MBSTRG(search_regs) = php_mb_regex_region_new();
+ MBSTRG(search_regs) = onig_region_new();
- err = php_mb_regex_search(MBSTRG(search_re), str, str + len, str + pos, str + len, MBSTRG(search_regs), 0);
- if (err == REG_MISMATCH) {
+ err = onig_search(MBSTRG(search_re), str, str + len, str + pos, str + len, MBSTRG(search_regs), 0);
+ if (err == ONIG_MISMATCH) {
MBSTRG(search_pos) = len;
RETVAL_FALSE;
} else if (err <= -2) {
- UChar err_str[REG_MAX_ERROR_MESSAGE_LEN];
- php_mb_regex_error_code_to_str(err_str, err);
+ UChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str(err_str, err);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in mbregex_search(): %s", err_str);
RETVAL_FALSE;
} else {
}
if (err < 0) {
- php_mb_regex_region_free(MBSTRG(search_regs), 1);
- MBSTRG(search_regs) = (php_mb_reg_region *)NULL;
+ onig_region_free(MBSTRG(search_regs), 1);
+ MBSTRG(search_regs) = (OnigRegion *)NULL;
}
}
/* }}} */
PHP_FUNCTION(mb_ereg_search_init)
{
zval **arg_str, **arg_pattern, **arg_options;
- php_mb_reg_syntax_type *syntax = NULL;
+ OnigSyntaxType *syntax = NULL;
int option;
option = MBSTRG(regex_default_options);
MBSTRG(search_pos) = 0;
if (MBSTRG(search_regs) != NULL) {
- php_mb_regex_region_free(MBSTRG(search_regs), 1);
- MBSTRG(search_regs) = (php_mb_reg_region *) NULL;
+ onig_region_free(MBSTRG(search_regs), 1);
+ MBSTRG(search_regs) = (OnigRegion *) NULL;
}
RETURN_TRUE;
/* }}} */
/* {{{ php_mb_regex_set_options */
-void php_mb_regex_set_options(php_mb_reg_option_type options, php_mb_reg_syntax_type *syntax, php_mb_reg_option_type *prev_options, php_mb_reg_syntax_type **prev_syntax TSRMLS_DC)
+void php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax TSRMLS_DC)
{
if (prev_options != NULL) {
*prev_options = MBSTRG(regex_default_options);
Set or get the default options for mbregex functions */
PHP_FUNCTION(mb_regex_set_options)
{
- php_mb_reg_option_type opt;
- php_mb_reg_syntax_type *syntax;
+ OnigOptionType opt;
+ OnigSyntaxType *syntax;
char *string = NULL;
int string_len;
char buf[16];
/* {{{ PHP_MBREGEX_GLOBALS */
#define PHP_MBREGEX_GLOBALS \
- php_mb_reg_char_encoding default_mbctype; \
- php_mb_reg_char_encoding current_mbctype; \
+ OnigEncoding default_mbctype; \
+ OnigEncoding current_mbctype; \
HashTable ht_rc; \
zval *search_str; \
zval *search_str_val; \
unsigned int search_pos; \
php_mb_regex_t *search_re; \
- struct php_mb_re_registers *search_regs; \
- int regex_default_options; \
- php_mb_reg_syntax_type *regex_default_syntax;
+ OnigRegion *search_regs; \
+ OnigOptionType regex_default_options; \
+ OnigSyntaxType *regex_default_syntax;
/* }}} */
/* {{{ PHP_MBREGEX_FUNCTION_ENTRIES */
PHP_RINIT_FUNCTION(mb_regex);
PHP_RSHUTDOWN_FUNCTION(mb_regex);
void _php_mb_regex_globals_ctor(zend_mbstring_globals_ptr pglobals TSRMLS_DC);
-void php_mb_regex_set_options(php_mb_reg_option_type options, php_mb_reg_syntax_type *syntax, php_mb_reg_option_type *prev_options, php_mb_reg_syntax_type **prev_syntax TSRMLS_DC);
+void php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax TSRMLS_DC);
void _php_mb_regex_globals_dtor(zend_mbstring_globals_ptr pglobals TSRMLS_DC);
-php_mb_reg_char_encoding php_mb_regex_name2mbctype(const char *pname);
-const char *php_mb_regex_mbctype2name(php_mb_reg_char_encoding mbctype);
+OnigEncoding php_mb_regex_name2mbctype(const char *pname);
+const char *php_mb_regex_mbctype2name(OnigEncoding mbctype);
PHP_FUNCTION(mb_regex_encoding);
PHP_FUNCTION(mb_ereg);