summaryrefslogtreecommitdiffstats
path: root/src/ex_getln.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 86da1aa88a..d221249e7e 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -2307,6 +2307,18 @@ realloc_cmdbuff(len)
return OK;
}
+#if defined(FEAT_ARABIC) || defined(PROTO)
+static char_u *arshape_buf = NULL;
+
+# if defined(EXITFREE) || defined(PROTO)
+ void
+free_cmdline_buf()
+{
+ vim_free(arshape_buf);
+}
+# endif
+#endif
+
/*
* Draw part of the cmdline at the current cursor position. But draw stars
* when cmdline_star is TRUE.
@@ -2333,7 +2345,6 @@ draw_cmdline(start, len)
#ifdef FEAT_ARABIC
if (p_arshape && !p_tbidi && enc_utf8 && len > 0)
{
- static char_u *buf;
static int buflen = 0;
char_u *p;
int j;
@@ -2354,10 +2365,10 @@ draw_cmdline(start, len)
{
/* Re-allocate the buffer. We keep it around to avoid a lot of
* alloc()/free() calls. */
- vim_free(buf);
+ vim_free(arshape_buf);
buflen = len * 2;
- buf = alloc(buflen);
- if (buf == NULL)
+ arshape_buf = alloc(buflen);
+ if (arshape_buf == NULL)
return; /* out of memory */
}
@@ -2394,23 +2405,24 @@ draw_cmdline(start, len)
u8c = arabic_shape(u8c, NULL, &u8c_c1, pc, pc1, nc);
- newlen += (*mb_char2bytes)(u8c, buf + newlen);
+ newlen += (*mb_char2bytes)(u8c, arshape_buf + newlen);
if (u8c_c1 != 0)
{
- newlen += (*mb_char2bytes)(u8c_c1, buf + newlen);
+ newlen += (*mb_char2bytes)(u8c_c1, arshape_buf + newlen);
if (u8c_c2 != 0)
- newlen += (*mb_char2bytes)(u8c_c2, buf + newlen);
+ newlen += (*mb_char2bytes)(u8c_c2,
+ arshape_buf + newlen);
}
}
else
{
prev_c = u8c;
- mch_memmove(buf + newlen, p, mb_l);
+ mch_memmove(arshape_buf + newlen, p, mb_l);
newlen += mb_l;
}
}
- msg_outtrans_len(buf, newlen);
+ msg_outtrans_len(arshape_buf, newlen);
}
else
#endif