]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1783 v7.4.1783
authorBram Moolenaar <Bram@vim.org>
Sun, 24 Apr 2016 12:40:12 +0000 (14:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 24 Apr 2016 12:40:12 +0000 (14:40 +0200)
Problem:    The old regexp engine doesn't handle character classes correctly.
            (Manuel Ortega)
Solution:   Use regmbc() instead of regc().  Add a test.

src/regexp.c
src/testdir/test_regexp_utf8.vim
src/version.c

index fada9fe95f9ff92c16a3f9739ee961139351b438..733d564253b681fa42fc35514586410cf835f94a 100644 (file)
@@ -2544,12 +2544,12 @@ collection:
                            case CLASS_ALNUM:
                                for (cu = 1; cu <= 255; cu++)
                                    if (isalnum(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_ALPHA:
                                for (cu = 1; cu <= 255; cu++)
                                    if (isalpha(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_BLANK:
                                regc(' ');
@@ -2558,32 +2558,32 @@ collection:
                            case CLASS_CNTRL:
                                for (cu = 1; cu <= 255; cu++)
                                    if (iscntrl(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_DIGIT:
                                for (cu = 1; cu <= 255; cu++)
                                    if (VIM_ISDIGIT(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_GRAPH:
                                for (cu = 1; cu <= 255; cu++)
                                    if (isgraph(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_LOWER:
                                for (cu = 1; cu <= 255; cu++)
                                    if (MB_ISLOWER(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_PRINT:
                                for (cu = 1; cu <= 255; cu++)
                                    if (vim_isprintc(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_PUNCT:
                                for (cu = 1; cu <= 255; cu++)
                                    if (ispunct(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_SPACE:
                                for (cu = 9; cu <= 13; cu++)
@@ -2593,12 +2593,12 @@ collection:
                            case CLASS_UPPER:
                                for (cu = 1; cu <= 255; cu++)
                                    if (MB_ISUPPER(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_XDIGIT:
                                for (cu = 1; cu <= 255; cu++)
                                    if (vim_isxdigit(cu))
-                                       regc(cu);
+                                       regmbc(cu);
                                break;
                            case CLASS_TAB:
                                regc('\t');
index f5d7ec946d4029f82af1c32e62f5856627d69033..cef24367757dbec578c39d88693fd79552d979b3 100644 (file)
@@ -33,3 +33,59 @@ func Test_equivalence_re2()
   set re=2
   call s:equivalence_test()
 endfunc
+
+func s:classes_test()
+  call assert_equal('Motörhead', matchstr('Motörhead', '[[:print:]]\+'))
+
+  let alphachars = ''
+  let lowerchars = ''
+  let upperchars = ''
+  let alnumchars = ''
+  let printchars = ''
+  let punctchars = ''
+  let xdigitchars = ''
+  let i = 1
+  while i <= 255
+    let c = nr2char(i)
+    if c =~ '[[:alpha:]]'
+      let alphachars .= c
+    endif
+    if c =~ '[[:lower:]]'
+      let lowerchars .= c
+    endif
+    if c =~ '[[:upper:]]'
+      let upperchars .= c
+    endif
+    if c =~ '[[:alnum:]]'
+      let alnumchars .= c
+    endif
+    if c =~ '[[:print:]]'
+      let printchars .= c
+    endif
+    if c =~ '[[:punct:]]'
+      let punctchars .= c
+    endif
+    if c =~ '[[:xdigit:]]'
+      let xdigitchars .= c
+    endif
+    let i += 1
+  endwhile
+
+  call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alphachars)
+  call assert_equal('abcdefghijklmnopqrstuvwxyzµßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ', lowerchars)
+  call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ', upperchars)
+  call assert_equal('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alnumchars)
+  call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ', printchars)
+  call assert_equal('!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~', punctchars)
+  call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
+endfunc
+
+func Test_classes_re1()
+  set re=1
+  call s:classes_test()
+endfunc
+
+func Test_classes_re2()
+  set re=2
+  call s:classes_test()
+endfunc
index 09372ef5da4ad83372b909c10c28d86c142761b3..a4f325205a951599db18d3313598f65b2fdb1cab 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1783,
 /**/
     1782,
 /**/