Skip to content

Commit af98a49

Browse files
committed
patch 7.4.1783
Problem: The old regexp engine doesn't handle character classes correctly. (Manuel Ortega) Solution: Use regmbc() instead of regc(). Add a test.
1 parent fca6600 commit af98a49

File tree

3 files changed

+68
-10
lines changed

3 files changed

+68
-10
lines changed

src/regexp.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2544,12 +2544,12 @@ regatom(int *flagp)
25442544
case CLASS_ALNUM:
25452545
for (cu = 1; cu <= 255; cu++)
25462546
if (isalnum(cu))
2547-
regc(cu);
2547+
regmbc(cu);
25482548
break;
25492549
case CLASS_ALPHA:
25502550
for (cu = 1; cu <= 255; cu++)
25512551
if (isalpha(cu))
2552-
regc(cu);
2552+
regmbc(cu);
25532553
break;
25542554
case CLASS_BLANK:
25552555
regc(' ');
@@ -2558,32 +2558,32 @@ regatom(int *flagp)
25582558
case CLASS_CNTRL:
25592559
for (cu = 1; cu <= 255; cu++)
25602560
if (iscntrl(cu))
2561-
regc(cu);
2561+
regmbc(cu);
25622562
break;
25632563
case CLASS_DIGIT:
25642564
for (cu = 1; cu <= 255; cu++)
25652565
if (VIM_ISDIGIT(cu))
2566-
regc(cu);
2566+
regmbc(cu);
25672567
break;
25682568
case CLASS_GRAPH:
25692569
for (cu = 1; cu <= 255; cu++)
25702570
if (isgraph(cu))
2571-
regc(cu);
2571+
regmbc(cu);
25722572
break;
25732573
case CLASS_LOWER:
25742574
for (cu = 1; cu <= 255; cu++)
25752575
if (MB_ISLOWER(cu))
2576-
regc(cu);
2576+
regmbc(cu);
25772577
break;
25782578
case CLASS_PRINT:
25792579
for (cu = 1; cu <= 255; cu++)
25802580
if (vim_isprintc(cu))
2581-
regc(cu);
2581+
regmbc(cu);
25822582
break;
25832583
case CLASS_PUNCT:
25842584
for (cu = 1; cu <= 255; cu++)
25852585
if (ispunct(cu))
2586-
regc(cu);
2586+
regmbc(cu);
25872587
break;
25882588
case CLASS_SPACE:
25892589
for (cu = 9; cu <= 13; cu++)
@@ -2593,12 +2593,12 @@ regatom(int *flagp)
25932593
case CLASS_UPPER:
25942594
for (cu = 1; cu <= 255; cu++)
25952595
if (MB_ISUPPER(cu))
2596-
regc(cu);
2596+
regmbc(cu);
25972597
break;
25982598
case CLASS_XDIGIT:
25992599
for (cu = 1; cu <= 255; cu++)
26002600
if (vim_isxdigit(cu))
2601-
regc(cu);
2601+
regmbc(cu);
26022602
break;
26032603
case CLASS_TAB:
26042604
regc('\t');

src/testdir/test_regexp_utf8.vim

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,59 @@ func Test_equivalence_re2()
3333
set re=2
3434
call s:equivalence_test()
3535
endfunc
36+
37+
func s:classes_test()
38+
call assert_equal('Motörhead', matchstr('Motörhead', '[[:print:]]\+'))
39+
40+
let alphachars = ''
41+
let lowerchars = ''
42+
let upperchars = ''
43+
let alnumchars = ''
44+
let printchars = ''
45+
let punctchars = ''
46+
let xdigitchars = ''
47+
let i = 1
48+
while i <= 255
49+
let c = nr2char(i)
50+
if c =~ '[[:alpha:]]'
51+
let alphachars .= c
52+
endif
53+
if c =~ '[[:lower:]]'
54+
let lowerchars .= c
55+
endif
56+
if c =~ '[[:upper:]]'
57+
let upperchars .= c
58+
endif
59+
if c =~ '[[:alnum:]]'
60+
let alnumchars .= c
61+
endif
62+
if c =~ '[[:print:]]'
63+
let printchars .= c
64+
endif
65+
if c =~ '[[:punct:]]'
66+
let punctchars .= c
67+
endif
68+
if c =~ '[[:xdigit:]]'
69+
let xdigitchars .= c
70+
endif
71+
let i += 1
72+
endwhile
73+
74+
call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alphachars)
75+
call assert_equal('abcdefghijklmnopqrstuvwxyzµßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ', lowerchars)
76+
call assert_equal('ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ', upperchars)
77+
call assert_equal('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', alnumchars)
78+
call assert_equal(' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ', printchars)
79+
call assert_equal('!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~', punctchars)
80+
call assert_equal('0123456789ABCDEFabcdef', xdigitchars)
81+
endfunc
82+
83+
func Test_classes_re1()
84+
set re=1
85+
call s:classes_test()
86+
endfunc
87+
88+
func Test_classes_re2()
89+
set re=2
90+
call s:classes_test()
91+
endfunc

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,8 @@ static char *(features[]) =
753753

754754
static int included_patches[] =
755755
{ /* Add new patch number below this line */
756+
/**/
757+
1783,
756758
/**/
757759
1782,
758760
/**/

0 commit comments

Comments
 (0)