From eaf1f9b9dc62b2201fa54374a88029de1b3f94fb Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 10 Mar 2017 21:22:42 -0500 Subject: [PATCH] vim-patch:7.4.2222 Problem: Sourcing a script where a character has 0x80 as a second byte does not work. (Filipe L B Correia) Solution: Turn 0x80 into K_SPECIAL KS_SPECIAL KE_FILLER. (Christian Brabandt, closes vim/vim#728) Add a test case. https://github.com/vim/vim/commit/6bff02eb530aa29aafa2cb5627399837be7a5dd5 --- src/nvim/getchar.c | 11 +--- src/nvim/misc1.c | 2 +- src/nvim/testdir/test_expr_utf8.vim | 57 --------------------- src/nvim/testdir/test_regexp_utf8.vim | 74 +++++++++++++++++++++++++++ src/nvim/version.c | 2 +- 5 files changed, 78 insertions(+), 68 deletions(-) diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index b7c6fd41f2..46c1e89c31 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -2460,7 +2460,7 @@ inchar ( if (typebuf_changed(tb_change_cnt)) return 0; - return fix_input_buffer(buf, len, script_char >= 0); + return fix_input_buffer(buf, len); } /* @@ -2468,12 +2468,7 @@ inchar ( * buf[] must have room to triple the number of bytes! * Returns the new length. */ -int -fix_input_buffer ( - char_u *buf, - int len, - int script /* TRUE when reading from a script */ -) +int fix_input_buffer(char_u *buf, int len) { if (!using_script()) { // Should not escape K_SPECIAL/CSI reading input from the user because vim @@ -2490,11 +2485,9 @@ fix_input_buffer ( // Replace NUL by K_SPECIAL KS_ZERO KE_FILLER // Replace K_SPECIAL by K_SPECIAL KS_SPECIAL KE_FILLER // Replace CSI by K_SPECIAL KS_EXTRA KE_CSI - // Don't replace K_SPECIAL when reading a script file. for (i = len; --i >= 0; ++p) { if (p[0] == NUL || (p[0] == K_SPECIAL - && !script && (i < 2 || p[1] != KS_EXTRA))) { memmove(p + 3, p + 1, (size_t)i); p[2] = (char_u)K_THIRD(p[0]); diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index d49d1d8a21..09549e86ca 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -2322,7 +2322,7 @@ int get_keystroke(void) n = os_inchar(buf + len, maxlen, len == 0 ? -1L : 100L, 0); if (n > 0) { /* Replace zero and CSI by a special key code. */ - n = fix_input_buffer(buf + len, n, FALSE); + n = fix_input_buffer(buf + len, n); len += n; waited = 0; } else if (len > 0) diff --git a/src/nvim/testdir/test_expr_utf8.vim b/src/nvim/testdir/test_expr_utf8.vim index 097d708329..9ea6d8872b 100644 --- a/src/nvim/testdir/test_expr_utf8.vim +++ b/src/nvim/testdir/test_expr_utf8.vim @@ -35,60 +35,3 @@ 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/testdir/test_regexp_utf8.vim b/src/nvim/testdir/test_regexp_utf8.vim index ecb03a0f8c..ecc7ed3e53 100644 --- a/src/nvim/testdir/test_regexp_utf8.vim +++ b/src/nvim/testdir/test_regexp_utf8.vim @@ -31,6 +31,80 @@ func Test_equivalence_re2() set re=0 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() + set re=0 +endfunc + +func Test_classes_re2() + set re=2 + call s:classes_test() + set re=0 +endfunc + +func Test_source_utf8() + " check that sourcing a script with 0x80 as second byte works + new + call setline(1, [':%s/àx/--à1234--/g', ':%s/Àx/--À1234--/g']) + write! Xscript + bwipe! + new + call setline(1, [' àx ', ' Àx ']) + source! Xscript | echo + call assert_equal(' --à1234-- ', getline(1)) + call assert_equal(' --À1234-- ', getline(2)) + bwipe! + call delete('Xscript') +endfunc + func Test_recursive_substitute() new s/^/\=execute("s#^##gn") diff --git a/src/nvim/version.c b/src/nvim/version.c index d99971b70d..8e8072bf29 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -218,7 +218,7 @@ static int included_patches[] = { 2225, // 2224, // 2223, - // 2222, + 2222, // 2221, 2220, 2219,