]> granicus.if.org Git - onig/commitdiff
add is_valid_mbc_string() member into OnigEncodingType
authorK.Kosako <kkosako0@gmail.com>
Sat, 27 Aug 2016 08:52:30 +0000 (17:52 +0900)
committerK.Kosako <kkosako0@gmail.com>
Sat, 27 Aug 2016 08:52:30 +0000 (17:52 +0900)
34 files changed:
src/ascii.c
src/big5.c
src/cp1251.c
src/euc_jp.c
src/euc_kr.c
src/euc_tw.c
src/gb18030.c
src/iso8859_1.c
src/iso8859_10.c
src/iso8859_11.c
src/iso8859_13.c
src/iso8859_14.c
src/iso8859_15.c
src/iso8859_16.c
src/iso8859_2.c
src/iso8859_3.c
src/iso8859_4.c
src/iso8859_5.c
src/iso8859_6.c
src/iso8859_7.c
src/iso8859_8.c
src/iso8859_9.c
src/koi8.c
src/koi8_r.c
src/oniguruma.h
src/regenc.c
src/regenc.h
src/regparse.c
src/sjis.c
src/utf16_be.c
src/utf16_le.c
src/utf32_be.c
src/utf32_le.c
src/utf8.c

index 92db179baf0fef573dc47e01378eb927b1b3d3ff..b21878d275ac796c86f480fbab1e15d7b7288748 100644 (file)
@@ -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
 };
index 3c90eaa46d700b2281deac434efa54f3f5f40974..3d449759a7a360fddfd00db864c453c90d8f5b8f 100644 (file)
@@ -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
 };
index af458473b74bdf812239671649ea203e6bf135b7..4d655bb459288a1a50aa51a95802de2cf1de9311 100644 (file)
@@ -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
 };
index 17f53e7458fadac8377ea94199947d6f298501c9..19422ce702db584715b345beca65c5e6b0578868 100644 (file)
@@ -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
 };
index 769104b7603517ac1e6d7ec2c6a0618ca0a00ac6..12803cdbd8c139933d631e52516cca9bc267e335 100644 (file)
@@ -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
 };
index f75796151d0b1e1a802b76561204686b45bf1674..4e07567af624607dd17b41bfa7df695247245385 100644 (file)
@@ -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
 };
index beeda06a34d133a8bed6280f2764ac61e9bdc4d8..36fc3de10b68d69a059c2e62edcdbc8d6c3f2bc6 100644 (file)
@@ -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
 };
index b2d8c9ac5617b3d1e50924ba93fe1396796adbb0..573931fdaf2c12612ab7ced1c5af39691554eb4d 100644 (file)
@@ -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
 };
index a6dbe5c3cd37d0b4d799b78fd3080cb9a2ed563f..91b18d4274e446188e90f296753a9c6779fe6818 100644 (file)
@@ -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
 };
index d671af8b1c93cae7d261cf4716ceac291369e22a..518be25412485e0aea56b67a291eed5efb9a67f2 100644 (file)
@@ -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
 };
index c97e24e7f97d1193854e9f322bb293b8b6e924cb..d1f39a24d6be86cbcd7aa0f797c8d1f2666895a8 100644 (file)
@@ -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
 };
index edf5313108f213475159d4938dc77578f7cf39c6..3361b0db40480481ccef0b7a4d814c2aaaadb769 100644 (file)
@@ -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
 };
index 24aa5730b28c2fac852d5d7fa5f009c89c5f0c82..b09e876171c9a84d11154b079129df1d847575f3 100644 (file)
@@ -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
 };
index 4f4c2b83089f28111069c16770418c624760931f..29a350ddbe44b551494a6be751f2a13427eb0325 100644 (file)
@@ -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
 };
index 16c1549cce7e09af05a912df1415f96cdedef834..9eb35365fcb00f08d00f3c1005fad6f1ce2a3f38 100644 (file)
@@ -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
 };
index 549f01e1a2727120c7c29f4116aba3e7c4915a27..862823a219d44532d3126ee0d586e09b2e499060 100644 (file)
@@ -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
 };
index 74b3a882ae0e7a241cb323bafa9c0dcb59ae1af4..db706da23cf9685b43721521b1f65addc4b70f1d 100644 (file)
@@ -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
 };
index 70c799a4c0687a16f61272e889e079327793804b..0e03e9cb81d3085c1afc40b539ffef77316d6ecc 100644 (file)
@@ -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
 };
index e36579a1fe2bbecc37c451e20a90d20870b4b69b..6289af5cfdd9285c2b6b507e75699c23930fdc6f 100644 (file)
@@ -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
 };
index 87a1acdd0556b63ca3f67b8884efe82ee9076e67..75b520f55247a74dfe9a5e1e4c927a046d070392 100644 (file)
@@ -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
 };
index e34a3bbf72f6237788c9ad69829779c881d6dc9f..5f18345e6190460a3887334a1ddbfdb0829a17a9 100644 (file)
@@ -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
 };
index 8cbbbd61f8ea32da84481ceac47ef6ce74115720..d0c06bb9aa852b2d0d5702d9578c4b080808b965 100644 (file)
@@ -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
 };
index 9c1177647420608b19ec528ec3089466846da322..80f89e93a5aed0286690239055f0f586889cb980 100644 (file)
@@ -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
 };
index 2f090f482b49354feaf113d344d42055d3dd0a1f..f8ef34fd46ce97cbe68f92aebbaf4f70a1ef6d19 100644 (file)
@@ -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
 };
index a09c9e92fb5f89d285140b2b090aaac131650514..8e4911d425cd412726262f44f76249cae5ddb0d5 100644 (file)
@@ -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) \
index 11745d30433532c28029090ad0699ea59b70b7c8..4517848a5497bfd017f6a8a9b53a20a975bdb8c5 100644 (file)
@@ -2,7 +2,7 @@
   regenc.c -  Oniguruma (regular expression library)
 **********************************************************************/
 /*-
- * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
+ * Copyright (c) 2002-2016  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
  * 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)
 {
index 12e96ed04788cba410dc54cf5a7c99cfec95f5f3..953765d5c2c04f914b770347818051ef70bd539e 100644 (file)
@@ -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));
index dacc74fd47e387754f0c86c36c9e04407803c78d..5af1c8cbdcb0e481e5bc36d1cfcadd15b3b597ca 100644 (file)
@@ -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);
index 84843ae538e5450b4f41b2af914508533e3dc40e..a607b3d71605fd2c98c4a8f68c2fada0a0b281a8 100644 (file)
@@ -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
 };
index e93b42a55e01a099f74157dc83acf846ae65f86f..f220cca228c07d1be2ee24ff8ea91cd6bf2bbc5d 100644 (file)
@@ -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
 };
index 2d9af522382fd7e68961711cd1aa92b3ee2436d6..4f0414e50cc2b9209b138596f38358a8121e2c58 100644 (file)
@@ -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
 };
index b8f64afd0981faaa4b087f72df0e6db22b711ba2..d0c7f397037181cfaae1912f40a9046b11a71c49 100644 (file)
@@ -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
 };
index a5a048edc43c5912d6440b927ec7dc74af206a6d..33200d104eae5915fba62d1b68c10a40845fb7ee 100644 (file)
@@ -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
 };
index 38b13a5c28b84aad643379b7d1d7d5b07048aabe..90b7ff05c03dbf6677895acd3350cc73593ced97 100644 (file)
@@ -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
 };