From: K.Kosako Date: Sat, 27 Aug 2016 08:52:30 +0000 (+0900) Subject: add is_valid_mbc_string() member into OnigEncodingType X-Git-Tag: v6.1.0~11 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42dcb6b0daf8bff19aacc268e3dc3e759e9a25d5;p=onig add is_valid_mbc_string() member into OnigEncodingType --- diff --git a/src/ascii.c b/src/ascii.c index 92db179..b21878d 100644 --- a/src/ascii.c +++ b/src/ascii.c @@ -56,5 +56,6 @@ OnigEncodingType OnigEncodingASCII = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/big5.c b/src/big5.c index 3c90eaa..3d44975 100644 --- a/src/big5.c +++ b/src/big5.c @@ -54,6 +54,12 @@ big5_mbc_enc_len(const UChar* p) return EncLen_BIG5[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_BIG5, s, end); +} + static OnigCodePoint big5_mbc_to_code(const UChar* p, const UChar* end) { @@ -160,5 +166,6 @@ OnigEncodingType OnigEncodingBIG5 = { big5_left_adjust_char_head, big5_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/cp1251.c b/src/cp1251.c index af45847..4d655bb 100644 --- a/src/cp1251.c +++ b/src/cp1251.c @@ -198,5 +198,6 @@ OnigEncodingType OnigEncodingCP1251 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/euc_jp.c b/src/euc_jp.c index 17f53e7..19422ce 100644 --- a/src/euc_jp.c +++ b/src/euc_jp.c @@ -56,6 +56,12 @@ mbc_enc_len(const UChar* p) return EncLen_EUCJP[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_EUC_JP, s, end); +} + static OnigCodePoint mbc_to_code(const UChar* p, const UChar* end) { @@ -269,5 +275,6 @@ OnigEncodingType OnigEncodingEUC_JP = { left_adjust_char_head, is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/euc_kr.c b/src/euc_kr.c index 769104b..12803cd 100644 --- a/src/euc_kr.c +++ b/src/euc_kr.c @@ -54,6 +54,12 @@ euckr_mbc_enc_len(const UChar* p) return EncLen_EUCKR[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_EUC_KR, s, end); +} + static OnigCodePoint euckr_mbc_to_code(const UChar* p, const UChar* end) { @@ -136,7 +142,8 @@ OnigEncodingType OnigEncodingEUC_KR = { euckr_left_adjust_char_head, euckr_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; /* Same with OnigEncodingEUC_KR except the name */ @@ -158,5 +165,6 @@ OnigEncodingType OnigEncodingEUC_CN = { euckr_left_adjust_char_head, euckr_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/euc_tw.c b/src/euc_tw.c index f757961..4e07567 100644 --- a/src/euc_tw.c +++ b/src/euc_tw.c @@ -54,6 +54,12 @@ euctw_mbc_enc_len(const UChar* p) return EncLen_EUCTW[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_EUC_TW, s, end); +} + static OnigCodePoint euctw_mbc_to_code(const UChar* p, const UChar* end) { @@ -127,5 +133,6 @@ OnigEncodingType OnigEncodingEUC_TW = { euctw_left_adjust_char_head, euctw_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/gb18030.c b/src/gb18030.c index beeda06..36fc3de 100644 --- a/src/gb18030.c +++ b/src/gb18030.c @@ -75,6 +75,12 @@ gb18030_mbc_enc_len(const UChar* p) return 2; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_GB18030, s, end); +} + static OnigCodePoint gb18030_mbc_to_code(const UChar* p, const UChar* end) { @@ -493,5 +499,6 @@ OnigEncodingType OnigEncodingGB18030 = { gb18030_left_adjust_char_head, gb18030_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/iso8859_1.c b/src/iso8859_1.c index b2d8c9a..573931f 100644 --- a/src/iso8859_1.c +++ b/src/iso8859_1.c @@ -270,5 +270,6 @@ OnigEncodingType OnigEncodingISO_8859_1 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_10.c b/src/iso8859_10.c index a6dbe5c..91b18d4 100644 --- a/src/iso8859_10.c +++ b/src/iso8859_10.c @@ -237,5 +237,6 @@ OnigEncodingType OnigEncodingISO_8859_10 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_11.c b/src/iso8859_11.c index d671af8..518be25 100644 --- a/src/iso8859_11.c +++ b/src/iso8859_11.c @@ -94,5 +94,6 @@ OnigEncodingType OnigEncodingISO_8859_11 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_13.c b/src/iso8859_13.c index c97e24e..d1f39a2 100644 --- a/src/iso8859_13.c +++ b/src/iso8859_13.c @@ -226,5 +226,6 @@ OnigEncodingType OnigEncodingISO_8859_13 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_14.c b/src/iso8859_14.c index edf5313..3361b0d 100644 --- a/src/iso8859_14.c +++ b/src/iso8859_14.c @@ -239,5 +239,6 @@ OnigEncodingType OnigEncodingISO_8859_14 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_15.c b/src/iso8859_15.c index 24aa573..b09e876 100644 --- a/src/iso8859_15.c +++ b/src/iso8859_15.c @@ -233,5 +233,6 @@ OnigEncodingType OnigEncodingISO_8859_15 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_16.c b/src/iso8859_16.c index 4f4c2b8..29a350d 100644 --- a/src/iso8859_16.c +++ b/src/iso8859_16.c @@ -235,5 +235,6 @@ OnigEncodingType OnigEncodingISO_8859_16 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_2.c b/src/iso8859_2.c index 16c1549..9eb3536 100644 --- a/src/iso8859_2.c +++ b/src/iso8859_2.c @@ -233,5 +233,6 @@ OnigEncodingType OnigEncodingISO_8859_2 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_3.c b/src/iso8859_3.c index 549f01e..862823a 100644 --- a/src/iso8859_3.c +++ b/src/iso8859_3.c @@ -233,5 +233,6 @@ OnigEncodingType OnigEncodingISO_8859_3 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_4.c b/src/iso8859_4.c index 74b3a88..db706da 100644 --- a/src/iso8859_4.c +++ b/src/iso8859_4.c @@ -235,5 +235,6 @@ OnigEncodingType OnigEncodingISO_8859_4 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_5.c b/src/iso8859_5.c index 70c799a..0e03e9c 100644 --- a/src/iso8859_5.c +++ b/src/iso8859_5.c @@ -224,5 +224,6 @@ OnigEncodingType OnigEncodingISO_8859_5 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_6.c b/src/iso8859_6.c index e36579a..6289af5 100644 --- a/src/iso8859_6.c +++ b/src/iso8859_6.c @@ -94,5 +94,6 @@ OnigEncodingType OnigEncodingISO_8859_6 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_7.c b/src/iso8859_7.c index 87a1acd..75b520f 100644 --- a/src/iso8859_7.c +++ b/src/iso8859_7.c @@ -220,5 +220,6 @@ OnigEncodingType OnigEncodingISO_8859_7 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_8.c b/src/iso8859_8.c index e34a3bb..5f18345 100644 --- a/src/iso8859_8.c +++ b/src/iso8859_8.c @@ -94,5 +94,6 @@ OnigEncodingType OnigEncodingISO_8859_8 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/iso8859_9.c b/src/iso8859_9.c index 8cbbbd6..d0c06bb 100644 --- a/src/iso8859_9.c +++ b/src/iso8859_9.c @@ -226,5 +226,6 @@ OnigEncodingType OnigEncodingISO_8859_9 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/koi8.c b/src/koi8.c index 9c11776..80f89e9 100644 --- a/src/koi8.c +++ b/src/koi8.c @@ -248,5 +248,6 @@ OnigEncodingType OnigEncodingKOI8 = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/koi8_r.c b/src/koi8_r.c index 2f090f4..f8ef34f 100644 --- a/src/koi8_r.c +++ b/src/koi8_r.c @@ -210,5 +210,6 @@ OnigEncodingType OnigEncodingKOI8_R = { onigenc_single_byte_left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + onigenc_always_true_is_valid_mbc_string }; diff --git a/src/oniguruma.h b/src/oniguruma.h index a09c9e9..8e4911d 100644 --- a/src/oniguruma.h +++ b/src/oniguruma.h @@ -165,6 +165,7 @@ typedef struct OnigEncodingTypeST { int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end); int (*init)(void); int (*is_initialized)(void); + int (*is_valid_mbc_string)(const OnigUChar* s, const OnigUChar* end); } OnigEncodingType; typedef OnigEncodingType* OnigEncoding; @@ -279,6 +280,8 @@ ONIG_EXTERN OnigEncodingType OnigEncodingGB18030; (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_IS_VALID_MBC_STRING(enc,s,end) \ + (enc)->is_valid_mbc_string(s,end) #define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \ (enc)->apply_all_case_fold(case_fold_flag,f,arg) #define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \ diff --git a/src/regenc.c b/src/regenc.c index 11745d3..4517848 100644 --- a/src/regenc.c +++ b/src/regenc.c @@ -2,7 +2,7 @@ regenc.c - Oniguruma (regular expression library) **********************************************************************/ /*- - * Copyright (c) 2002-2007 K.Kosako + * Copyright (c) 2002-2016 K.Kosako * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -661,6 +661,27 @@ onigenc_always_false_is_allowed_reverse_match(const UChar* s ARG_UNUSED, return FALSE; } +extern int +onigenc_always_true_is_valid_mbc_string(const UChar* s ARG_UNUSED, + const UChar* end ARG_UNUSED) +{ + return TRUE; +} + +extern int +onigenc_length_check_is_valid_mbc_string(OnigEncoding enc, + const UChar* p, const UChar* end) +{ + while (p < end) { + p += enclen(enc, p); + } + + if (p != end) + return FALSE; + else + return TRUE; +} + extern OnigCodePoint onigenc_mbn_mbc_to_code(OnigEncoding enc, const UChar* p, const UChar* end) { diff --git a/src/regenc.h b/src/regenc.h index 12e96ed..953765d 100644 --- a/src/regenc.h +++ b/src/regenc.h @@ -135,6 +135,8 @@ ONIG_EXTERN int onigenc_single_byte_code_to_mbc P_((OnigCodePoint code, UChar *b ONIG_EXTERN UChar* onigenc_single_byte_left_adjust_char_head P_((const UChar* start, const UChar* s)); ONIG_EXTERN int onigenc_always_true_is_allowed_reverse_match P_((const UChar* s, const UChar* end)); ONIG_EXTERN int onigenc_always_false_is_allowed_reverse_match P_((const UChar* s, const UChar* end)); +ONIG_EXTERN int onigenc_always_true_is_valid_mbc_string P_((const UChar* s, const UChar* end)); +ONIG_EXTERN int onigenc_length_check_is_valid_mbc_string P_((OnigEncoding enc, const UChar* s, const UChar* end)); /* methods for multi byte encoding */ ONIG_EXTERN OnigCodePoint onigenc_mbn_mbc_to_code P_((OnigEncoding enc, const UChar* p, const UChar* end)); diff --git a/src/regparse.c b/src/regparse.c index dacc74f..5af1c8c 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -5303,19 +5303,6 @@ parse_regexp(Node** top, UChar** src, UChar* end, ScanEnv* env) return 0; } -static int -check_incomplete_multibyte_string(OnigEncoding enc, const UChar* p, const UChar* end) -{ - while (p < end) { - p += enclen(enc, p); - } - - if (p != end) - return -1; - else - return 0; -} - extern int onig_parse_make_tree(Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env) @@ -5338,8 +5325,8 @@ onig_parse_make_tree(Node** root, const UChar* pattern, const UChar* end, *root = NULL; - if (check_incomplete_multibyte_string(env->enc, pattern, end) != 0) - return ONIGERR_TOO_SHORT_MULTI_BYTE_STRING; + if (! ONIGENC_IS_VALID_MBC_STRING(env->enc, pattern, end)) + return ONIGERR_INVALID_WIDE_CHAR_VALUE; p = (UChar* )pattern; r = parse_regexp(root, &p, (UChar* )end, env); diff --git a/src/sjis.c b/src/sjis.c index 84843ae..a607b3d 100644 --- a/src/sjis.c +++ b/src/sjis.c @@ -76,6 +76,12 @@ mbc_enc_len(const UChar* p) return EncLen_SJIS[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_SJIS, s, end); +} + static int code_to_mbclen(OnigCodePoint code) { @@ -303,5 +309,6 @@ OnigEncodingType OnigEncodingSJIS = { left_adjust_char_head, is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/utf16_be.c b/src/utf16_be.c index e93b42a..f220cca 100644 --- a/src/utf16_be.c +++ b/src/utf16_be.c @@ -54,6 +54,12 @@ utf16be_mbc_enc_len(const UChar* p) return EncLen_UTF16[*p]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_UTF16_BE, s, end); +} + static int utf16be_is_mbc_newline(const UChar* p, const UChar* end) { @@ -224,5 +230,6 @@ OnigEncodingType OnigEncodingUTF16_BE = { utf16be_left_adjust_char_head, onigenc_always_false_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/utf16_le.c b/src/utf16_le.c index 2d9af52..4f0414e 100644 --- a/src/utf16_le.c +++ b/src/utf16_le.c @@ -60,6 +60,12 @@ utf16le_mbc_enc_len(const UChar* p) return EncLen_UTF16[*(p+1)]; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_UTF16_LE, s, end); +} + static int utf16le_is_mbc_newline(const UChar* p, const UChar* end) { @@ -225,5 +231,6 @@ OnigEncodingType OnigEncodingUTF16_LE = { utf16le_left_adjust_char_head, onigenc_always_false_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/utf32_be.c b/src/utf32_be.c index b8f64af..d0c7f39 100644 --- a/src/utf32_be.c +++ b/src/utf32_be.c @@ -35,6 +35,12 @@ utf32be_mbc_enc_len(const UChar* p ARG_UNUSED) return 4; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_UTF32_BE, s, end); +} + static int utf32be_is_mbc_newline(const UChar* p, const UChar* end) { @@ -183,5 +189,6 @@ OnigEncodingType OnigEncodingUTF32_BE = { utf32be_left_adjust_char_head, onigenc_always_false_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/utf32_le.c b/src/utf32_le.c index a5a048e..33200d1 100644 --- a/src/utf32_le.c +++ b/src/utf32_le.c @@ -35,6 +35,12 @@ utf32le_mbc_enc_len(const UChar* p ARG_UNUSED) return 4; } +static int +is_valid_mbc_string(const UChar* s, const UChar* end) +{ + return onigenc_length_check_is_valid_mbc_string(ONIG_ENCODING_UTF32_LE, s, end); +} + static int utf32le_is_mbc_newline(const UChar* p, const UChar* end) { @@ -183,5 +189,6 @@ OnigEncodingType OnigEncodingUTF32_LE = { utf32le_left_adjust_char_head, onigenc_always_false_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string }; diff --git a/src/utf8.c b/src/utf8.c index 38b13a5..90b7ff0 100644 --- a/src/utf8.c +++ b/src/utf8.c @@ -39,6 +39,7 @@ #endif #define utf8_islead(c) ((UChar )((c) & 0xc0) != 0x80) +#define utf8_istail(c) ((UChar )((c) & 0xc0) == 0x80) static const int EncLen_UTF8[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -65,6 +66,33 @@ mbc_enc_len(const UChar* p) return EncLen_UTF8[*p]; } +static int +is_valid_mbc_string(const UChar* p, const UChar* end) +{ + int i, len; + + while (p < end) { + if (! utf8_islead(*p)) + return FALSE; + + len = mbc_enc_len(p++); + if (len > 1) { + for (i = 1; i < len; i++) { + if (p == end) + return FALSE; + + if (! utf8_istail(*p++)) + return FALSE; + } + } + } + + if (p != end) + return FALSE; + else + return TRUE; +} + static int is_mbc_newline(const UChar* p, const UChar* end) { @@ -303,5 +331,6 @@ OnigEncodingType OnigEncodingUTF8 = { left_adjust_char_head, onigenc_always_true_is_allowed_reverse_match, NULL, /* init */ - NULL /* is_initialized */ + NULL, /* is_initialized */ + is_valid_mbc_string };