diff options
| -rw-r--r-- | src/nvim/regexp.c | 80 | ||||
| -rw-r--r-- | src/nvim/regexp_nfa.c | 12 | ||||
| -rw-r--r-- | src/nvim/testdir/test_expr_utf8.vim | 57 | ||||
| -rw-r--r-- | src/nvim/version.c | 6 | 
4 files changed, 118 insertions, 37 deletions
| diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 64a70c295a..6613d284d7 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -2309,48 +2309,64 @@ collection:                }                break;              case CLASS_ALNUM: -              for (cu = 1; cu <= 255; cu++) -                if (isalnum(cu)) -                  regc(cu); +              for (cu = 1; cu < 128; cu++) { +                if (isalnum(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_ALPHA: -              for (cu = 1; cu <= 255; cu++) -                if (isalpha(cu)) -                  regc(cu); +              for (cu = 1; cu < 128; cu++) { +                if (isalpha(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_BLANK:                regc(' ');                regc('\t');                break;              case CLASS_CNTRL: -              for (cu = 1; cu <= 255; cu++) -                if (iscntrl(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (iscntrl(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_DIGIT: -              for (cu = 1; cu <= 255; cu++) -                if (ascii_isdigit(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (ascii_isdigit(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_GRAPH: -              for (cu = 1; cu <= 255; cu++) -                if (isgraph(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (isgraph(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_LOWER: -              for (cu = 1; cu <= 255; cu++) -                if (vim_islower(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (vim_islower(cu) && cu != 170 && cu != 186) { +                  regmbc(cu); +                } +              }                break;              case CLASS_PRINT: -              for (cu = 1; cu <= 255; cu++) -                if (vim_isprintc(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (vim_isprintc(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_PUNCT: -              for (cu = 1; cu <= 255; cu++) -                if (ispunct(cu)) -                  regc(cu); +              for (cu = 1; cu < 128; cu++) { +                if (ispunct(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_SPACE:                for (cu = 9; cu <= 13; cu++) @@ -2358,14 +2374,18 @@ collection:                regc(' ');                break;              case CLASS_UPPER: -              for (cu = 1; cu <= 255; cu++) -                if (vim_isupper(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (vim_isupper(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_XDIGIT: -              for (cu = 1; cu <= 255; cu++) -                if (ascii_isxdigit(cu)) -                  regc(cu); +              for (cu = 1; cu <= 255; cu++) { +                if (ascii_isxdigit(cu)) { +                  regmbc(cu); +                } +              }                break;              case CLASS_TAB:                regc('\t'); diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index d96858632f..474f3df32a 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -4320,12 +4320,14 @@ static int check_char_class(int class, int c)  {    switch (class) {    case NFA_CLASS_ALNUM: -    if (c >= 1 && c <= 255 && isalnum(c)) +    if (c >= 1 && c < 128 && isalnum(c)) {        return OK; +    }      break;    case NFA_CLASS_ALPHA: -    if (c >= 1 && c <= 255 && isalpha(c)) +    if (c >= 1 && c < 128 && isalpha(c)) {        return OK; +    }      break;    case NFA_CLASS_BLANK:      if (c == ' ' || c == '\t') @@ -4344,16 +4346,18 @@ static int check_char_class(int class, int c)        return OK;      break;    case NFA_CLASS_LOWER: -    if (vim_islower(c)) +    if (vim_islower(c) && c != 170 && c != 186) {        return OK; +    }      break;    case NFA_CLASS_PRINT:      if (vim_isprintc(c))        return OK;      break;    case NFA_CLASS_PUNCT: -    if (c >= 1 && c <= 255 && ispunct(c)) +    if (c >= 1 && c < 128 && ispunct(c)) {        return OK; +    }      break;    case NFA_CLASS_SPACE:      if ((c >= 9 && c <= 13) || (c == ' ')) diff --git a/src/nvim/testdir/test_expr_utf8.vim b/src/nvim/testdir/test_expr_utf8.vim index 9ea6d8872b..097d708329 100644 --- a/src/nvim/testdir/test_expr_utf8.vim +++ b/src/nvim/testdir/test_expr_utf8.vim @@ -35,3 +35,60 @@ func Test_strcharpart_utf8()    call assert_equal('̀', strcharpart('àxb', 1, 1))    call assert_equal('x', strcharpart('àxb', 2, 1))  endfunc + +func s:classes_test() +  set isprint=@,161-255 +  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 diff --git a/src/nvim/version.c b/src/nvim/version.c index 0921749eb5..be17b6775a 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -646,7 +646,7 @@ static int included_patches[] = {    // 1796 NA    // 1795 NA    // 1794 NA -  // 1793, +  1793,    // 1792 NA    // 1791 NA    // 1790 NA @@ -655,9 +655,9 @@ static int included_patches[] = {    // 1788 NA    // 1787 NA    // 1786 NA -  // 1785, +  1785,    // 1784 NA -  // 1783, +  1783,    1782,    // 1781,    1780, | 
