summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-08-16 22:50:55 +0200
committerBram Moolenaar <Bram@vim.org>2016-08-16 22:50:55 +0200
commit6bff02eb530aa29aafa2cb5627399837be7a5dd5 (patch)
treebbdc08501666f8c44b1bc16b8f4724360555b398
parent91984b9034d3b698459622be277d963e0c6df60e (diff)
downloadvim-git-6bff02eb530aa29aafa2cb5627399837be7a5dd5.tar.gz
patch 7.4.2222v7.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 #728) Add a test case.
-rw-r--r--src/getchar.c10
-rw-r--r--src/misc1.c2
-rw-r--r--src/proto/getchar.pro2
-rw-r--r--src/testdir/test_regexp_utf8.vim19
-rw-r--r--src/version.c2
5 files changed, 26 insertions, 9 deletions
diff --git a/src/getchar.c b/src/getchar.c
index 03c75869e..1c170cc43 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3060,7 +3060,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);
}
/*
@@ -3069,10 +3069,7 @@ inchar(
* Returns the new length.
*/
int
-fix_input_buffer(
- char_u *buf,
- int len,
- int script) /* TRUE when reading from a script */
+fix_input_buffer(char_u *buf, int len)
{
int i;
char_u *p = buf;
@@ -3083,7 +3080,6 @@ 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)
{
@@ -3106,7 +3102,7 @@ fix_input_buffer(
}
else
#endif
- if (p[0] == NUL || (p[0] == K_SPECIAL && !script
+ if (p[0] == NUL || (p[0] == K_SPECIAL
#ifdef FEAT_AUTOCMD
/* timeout may generate K_CURSORHOLD */
&& (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD)
diff --git a/src/misc1.c b/src/misc1.c
index 2ee87b1f2..8cb3b6fd9 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3416,7 +3416,7 @@ get_keystroke(void)
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;
}
diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro
index dc117b0ac..de33bfd14 100644
--- a/src/proto/getchar.pro
+++ b/src/proto/getchar.pro
@@ -47,7 +47,7 @@ int vpeekc_nomap(void);
int vpeekc_any(void);
int char_avail(void);
void vungetc(int c);
-int fix_input_buffer(char_u *buf, int len, int script);
+int fix_input_buffer(char_u *buf, int len);
int input_available(void);
int do_map(int maptype, char_u *arg, int mode, int abbrev);
int get_map_mode(char_u **cmdp, int forceit);
diff --git a/src/testdir/test_regexp_utf8.vim b/src/testdir/test_regexp_utf8.vim
index 81d8f5b04..ea9182916 100644
--- a/src/testdir/test_regexp_utf8.vim
+++ b/src/testdir/test_regexp_utf8.vim
@@ -25,11 +25,13 @@ endfunc
func Test_equivalence_re1()
set re=1
call s:equivalence_test()
+ set re=0
endfunc
func Test_equivalence_re2()
set re=2
call s:equivalence_test()
+ set re=0
endfunc
func s:classes_test()
@@ -82,9 +84,26 @@ 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
diff --git a/src/version.c b/src/version.c
index 0395201c6..539685dde 100644
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2222,
+/**/
2221,
/**/
2220,