]> granicus.if.org Git - onig/commitdiff
add ascii_mode switch into add_ctype_to_cc()
authorK.Kosako <kkosako0@gmail.com>
Sun, 13 Aug 2017 02:47:49 +0000 (11:47 +0900)
committerK.Kosako <kkosako0@gmail.com>
Sun, 13 Aug 2017 02:47:49 +0000 (11:47 +0900)
src/regparse.c

index c4c537c156df7a651a7437640451baa379d7e639..f961db68752fbd1a0d53c4ea1f734649d3fa1695 100644 (file)
@@ -4605,21 +4605,33 @@ add_ctype_to_cc_by_range_limit(CClassNode* cc, int ctype ARG_UNUSED, int not,
 static int
 add_ctype_to_cc(CClassNode* cc, int ctype, int not, ScanEnv* env)
 {
+#define ASCII_LIMIT    127
+
   int c, r;
+  int ascii_mode;
   const OnigCodePoint *ranges;
+  OnigCodePoint limit;
   OnigCodePoint sb_out;
   OnigEncoding enc = env->enc;
 
+  ascii_mode = 0;
+
   r = ONIGENC_GET_CTYPE_CODE_RANGE(enc, ctype, &sb_out, &ranges);
   if (r == 0) {
-    return add_ctype_to_cc_by_range(cc, ctype, not, env->enc, sb_out,
-                                    ranges);
+    if (ascii_mode == 0)
+      r = add_ctype_to_cc_by_range(cc, ctype, not, env->enc, sb_out, ranges);
+    else
+      r = add_ctype_to_cc_by_range_limit(cc, ctype, not, env->enc, sb_out,
+                                         ranges, ASCII_LIMIT);
+    return r;
   }
   else if (r != ONIG_NO_SUPPORT_CONFIG) {
     return r;
   }
 
   r = 0;
+  limit = ascii_mode ? ASCII_LIMIT : SINGLE_BYTE_SIZE;
+
   switch (ctype) {
   case ONIGENC_CTYPE_ALPHA:
   case ONIGENC_CTYPE_BLANK:
@@ -4633,14 +4645,18 @@ add_ctype_to_cc(CClassNode* cc, int ctype, int not, ScanEnv* env)
   case ONIGENC_CTYPE_ASCII:
   case ONIGENC_CTYPE_ALNUM:
     if (not != 0) {
-      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+      for (c = 0; c < limit; c++) {
         if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
           BITSET_SET_BIT(cc->bs, c);
       }
+      for (c = limit; c < SINGLE_BYTE_SIZE; c++) {
+        BITSET_SET_BIT(cc->bs, c);
+      }
+
       ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);
     }
     else {
-      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
+      for (c = 0; c < limit; c++) {
         if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
           BITSET_SET_BIT(cc->bs, c);
       }
@@ -4649,34 +4665,25 @@ add_ctype_to_cc(CClassNode* cc, int ctype, int not, ScanEnv* env)
 
   case ONIGENC_CTYPE_GRAPH:
   case ONIGENC_CTYPE_PRINT:
+  case ONIGENC_CTYPE_WORD:
     if (not != 0) {
-      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {
-        if (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
+      for (c = 0; c < limit; c++) {
+        if (ONIGENC_CODE_TO_MBCLEN(enc, c) > 0 /* check invalid code point */
+            && ! 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))
+      for (c = limit; c < SINGLE_BYTE_SIZE; c++) {
+        if (ONIGENC_CODE_TO_MBCLEN(enc, c) > 0)
           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_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_CODE_TO_MBCLEN(enc, c) > 0) /* check invalid code point */
-            && ! ONIGENC_IS_CODE_WORD(enc, c))
+      for (c = 0; c < limit; c++) {
+        if (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))
           BITSET_SET_BIT(cc->bs, c);
       }
+      if (ascii_mode == 0)
+        ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);
     }
     break;