summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--enc/unicode.c8
-rw-r--r--enc/unicode/casefold.h8
-rw-r--r--regparse.c14
4 files changed, 32 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 4eb41d82d1..4ab119dd60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Thu Mar 1 01:25:43 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * regparse.c (is_onechar_cclass): optimize character class
+ Merge Onigmo 27278c12e6674043cc8affca6507e20e119a86ee.
+
+ * regparse.c (is_onechar_cclass): [bug] unexpected match occurs when a
+ char class contains no char
+
+ * enc/unicode.c (init_case_fold_table): define the sizes of case
+ folding tables in casefold.h
+
Wed Feb 29 16:11:34 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/Makefile.sub (MAKEDIRS): use mkdir of cmd.exe instead of ruby.
diff --git a/enc/unicode.c b/enc/unicode.c
index 1dda3f32f8..20990c1e54 100644
--- a/enc/unicode.c
+++ b/enc/unicode.c
@@ -238,7 +238,7 @@ static int init_case_fold_table(void)
THREAD_ATOMIC_START;
- FoldTable = st_init_numtable_with_size(1400);
+ FoldTable = st_init_numtable_with_size(FOLD_TABLE_SIZE);
if (ONIG_IS_NULL(FoldTable)) return ONIGERR_MEMORY;
for (i = 0; i < numberof(CaseFold); i++) {
p = &CaseFold[i];
@@ -249,7 +249,7 @@ static int init_case_fold_table(void)
st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));
}
- Unfold1Table = st_init_numtable_with_size(1200);
+ Unfold1Table = st_init_numtable_with_size(UNFOLD1_TABLE_SIZE);
if (ONIG_IS_NULL(Unfold1Table)) return ONIGERR_MEMORY;
for (i = 0; i < numberof(CaseUnfold_11); i++) {
@@ -261,7 +261,7 @@ static int init_case_fold_table(void)
st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));
}
- Unfold2Table = st_init_table_with_size(&type_code2_hash, 200);
+ Unfold2Table = st_init_table_with_size(&type_code2_hash, UNFOLD2_TABLE_SIZE);
if (ONIG_IS_NULL(Unfold2Table)) return ONIGERR_MEMORY;
for (i = 0; i < numberof(CaseUnfold_12); i++) {
@@ -273,7 +273,7 @@ static int init_case_fold_table(void)
st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));
}
- Unfold3Table = st_init_table_with_size(&type_code3_hash, 30);
+ Unfold3Table = st_init_table_with_size(&type_code3_hash, UNFOLD3_TABLE_SIZE);
if (ONIG_IS_NULL(Unfold3Table)) return ONIGERR_MEMORY;
for (i = 0; i < numberof(CaseUnfold_13); i++) {
diff --git a/enc/unicode/casefold.h b/enc/unicode/casefold.h
index b4f2ee3c9e..b9559de4a3 100644
--- a/enc/unicode/casefold.h
+++ b/enc/unicode/casefold.h
@@ -1,3 +1,6 @@
+/* DO NOT EDIT THIS FILE. */
+/* Generated by tool/CaseFolding.py */
+
static const CaseFold_11_Type CaseFold[] = {
{ 0x0041, {1, {0x0061}}},
{ 0x0042, {1, {0x0062}}},
@@ -2228,3 +2231,8 @@ static const CaseUnfold_13_Type CaseUnfold_13[] = {
{ {0x03c5, 0x0313, 0x0342}, {1, {0x1f56 }}},
{ {0x03c9, 0x0342, 0x03b9}, {1, {0x1ff7 }}},
};
+
+#define FOLD_TABLE_SIZE 1357
+#define UNFOLD1_TABLE_SIZE 1207
+#define UNFOLD2_TABLE_SIZE 88
+#define UNFOLD3_TABLE_SIZE 23
diff --git a/regparse.c b/regparse.c
index 08ffa8060d..f1e8e4f20a 100644
--- a/regparse.c
+++ b/regparse.c
@@ -1786,8 +1786,8 @@ add_code_range_to_buf0(BBuf** pbuf, ScanEnv* env, OnigCodePoint from, OnigCodePo
if (inc_n != 1) {
if (checkdup && from <= data[low*2+1]
- && (data[low*2] <= from || data[low*2+1] <= to))
- CC_DUP_WARN(env);
+ && (data[low*2] <= from || data[low*2+1] <= to))
+ CC_DUP_WARN(env);
if (from > data[low*2])
from = data[low*2];
if (to < data[(high - 1)*2 + 1])
@@ -1799,7 +1799,7 @@ add_code_range_to_buf0(BBuf** pbuf, ScanEnv* env, OnigCodePoint from, OnigCodePo
int to_pos = SIZE_CODE_POINT * (1 + (low + 1) * 2);
if (inc_n > 0) {
- if ((OnigCodePoint )high < n) {
+ if (high < n) {
int size = (n - high) * 2 * SIZE_CODE_POINT;
BBUF_MOVE_RIGHT(bbuf, from_pos, to_pos, size);
}
@@ -5722,9 +5722,13 @@ is_onechar_cclass(CClassNode* cc, OnigCodePoint* code)
}
}
}
+ if (found == 0) {
+ /* the character class contains no char. */
+ return 0;
+ }
if (j >= 0) {
/* only one char found in the bitset, calculate the code point. */
- c = BITS_IN_ROOM * j + (countbits(b2 - 1) & 0x1f);
+ c = BITS_IN_ROOM * j + countbits(b2 - 1);
}
*code = c;
return 1;
@@ -5746,7 +5750,7 @@ parse_exp(Node** np, OnigToken* tok, int term,
switch (tok->type) {
case TK_ALT:
case TK_EOT:
- end_of_token:
+ end_of_token:
*np = node_new_empty();
return tok->type;
break;