patch 8.2.0783: libvterm code lags behind the upstream version
Problem: Libvterm code lags behind the upstream version.
Solution: Include revisions 728 - 729.
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 94561e5..517ed2b 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -1246,6 +1246,7 @@
CCCTERM = $(CC) -c $(CFLAGS) -Ilibvterm/include -DINLINE="" \
-DVSNPRINTF=vim_vsnprintf \
+ -DSNPRINTF=vim_snprintf \
-DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
-DWCWIDTH_FUNCTION=utf_uint2cells \
-DGET_SPECIAL_PTY_TYPE_FUNCTION=get_special_pty_type
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index c93517b..8240f50 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1812,6 +1812,7 @@
CCCTERM = $(CC) $(CFLAGS) -Ilibvterm/include -DINLINE="" \
-DVSNPRINTF=vim_vsnprintf \
+ -DSNPRINTF=vim_snprintf \
-DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
-DWCWIDTH_FUNCTION=utf_uint2cells \
-DGET_SPECIAL_PTY_TYPE_FUNCTION=get_special_pty_type \
diff --git a/src/Makefile b/src/Makefile
index 7c2934a..ad8f241 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -3537,6 +3537,7 @@
# prefix vterm_ to avoid name clashes.
CCCTERM = $(CCC_NF) $(VTERM_CFLAGS) $(ALL_CFLAGS) -DINLINE="" \
-DVSNPRINTF=vim_vsnprintf \
+ -DSNPRINTF=vim_snprintf \
-DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
-DWCWIDTH_FUNCTION=utf_uint2cells
diff --git a/src/libvterm/src/keyboard.c b/src/libvterm/src/keyboard.c
index 95b962e..9c2a53d 100644
--- a/src/libvterm/src/keyboard.c
+++ b/src/libvterm/src/keyboard.c
@@ -102,10 +102,10 @@
static keycodes_s keycodes_fn[] = {
{ KEYCODE_NONE, 0, 0 }, // F0 - shouldn't happen
- { KEYCODE_CSI_CURSOR, 'P', 0 }, // F1
- { KEYCODE_CSI_CURSOR, 'Q', 0 }, // F2
- { KEYCODE_CSI_CURSOR, 'R', 0 }, // F3
- { KEYCODE_CSI_CURSOR, 'S', 0 }, // F4
+ { KEYCODE_SS3, 'P', 0 }, // F1
+ { KEYCODE_SS3, 'Q', 0 }, // F2
+ { KEYCODE_SS3, 'R', 0 }, // F3
+ { KEYCODE_SS3, 'S', 0 }, // F4
{ KEYCODE_CSINUM, '~', 15 }, // F5
{ KEYCODE_CSINUM, '~', 17 }, // F6
{ KEYCODE_CSINUM, '~', 18 }, // F7
diff --git a/src/libvterm/src/vterm.c b/src/libvterm/src/vterm.c
index 1d6a977..56c4e28 100644
--- a/src/libvterm/src/vterm.c
+++ b/src/libvterm/src/vterm.c
@@ -74,6 +74,9 @@
return NULL;
}
+ vt->tmpbuffer_len = 64;
+ vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len);
+
return vt;
}
@@ -135,67 +138,46 @@
INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len)
{
if(len > vt->outbuffer_len - vt->outbuffer_cur) {
- DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n");
- len = vt->outbuffer_len - vt->outbuffer_cur;
+ DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping output\n");
+ return;
}
memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len);
vt->outbuffer_cur += len;
}
-static int outbuffer_is_full(VTerm *vt)
-{
- return vt->outbuffer_cur >= vt->outbuffer_len - 1;
-}
-
#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \
|| defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE)
# undef VSNPRINTF
# define VSNPRINTF vsnprintf
+# undef SNPRINTF
+# define SNPRINTF snprintf
#else
# ifdef VSNPRINTF
// Use a provided vsnprintf() function.
int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap);
# endif
+# ifdef SNPRINTF
+// Use a provided snprintf() function.
+int SNPRINTF(char *str, size_t str_m, const char *fmt, ...);
+# endif
#endif
INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args)
{
- int written;
+ size_t len;
#ifndef VSNPRINTF
// When vsnprintf() is not available (C90) fall back to vsprintf().
char buffer[1024]; // 1Kbyte is enough for everybody, right?
#endif
- if(outbuffer_is_full(vt)) {
- DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n");
- return;
- }
-
#ifdef VSNPRINTF
- written = VSNPRINTF(vt->outbuffer + vt->outbuffer_cur,
- vt->outbuffer_len - vt->outbuffer_cur,
- format, args);
-
- if(written == (int)(vt->outbuffer_len - vt->outbuffer_cur)) {
- // output was truncated
- vt->outbuffer_cur = vt->outbuffer_len - 1;
- }
- else
- vt->outbuffer_cur += written;
+ len = VSNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, format, args);
+ vterm_push_output_bytes(vt, vt->tmpbuffer, len);
#else
- written = vsprintf(buffer, format, args);
-
- if(written >= (int)(vt->outbuffer_len - vt->outbuffer_cur - 1)) {
- // output was truncated
- written = vt->outbuffer_len - vt->outbuffer_cur - 1;
- }
- if (written > 0)
- {
- strncpy(vt->outbuffer + vt->outbuffer_cur, buffer, written + 1);
- vt->outbuffer_cur += written;
- }
+ len = vsprintf(buffer, format, args);
+ vterm_push_output_bytes(vt, buffer, len);
#endif
}
@@ -209,40 +191,52 @@
INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...)
{
- size_t orig_cur = vt->outbuffer_cur;
+ size_t cur;
va_list args;
if(ctrl >= 0x80 && !vt->mode.ctrl8bit)
- vterm_push_output_sprintf(vt, ESC_S "%c", ctrl - 0x40);
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ ESC_S "%c", ctrl - 0x40);
else
- vterm_push_output_sprintf(vt, "%c", ctrl);
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ "%c", ctrl);
+ if(cur >= vt->tmpbuffer_len)
+ return;
+ vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
va_start(args, fmt);
vterm_push_output_vsprintf(vt, fmt, args);
va_end(args);
-
- if(outbuffer_is_full(vt))
- vt->outbuffer_cur = orig_cur;
}
INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...)
{
- size_t orig_cur = vt->outbuffer_cur;
+ size_t cur;
va_list args;
if(!vt->mode.ctrl8bit)
- vterm_push_output_sprintf(vt, ESC_S "%c", C1_DCS - 0x40);
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ ESC_S "%c", C1_DCS - 0x40);
else
- vterm_push_output_sprintf(vt, "%c", C1_DCS);
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ "%c", C1_DCS);
+ if(cur >= vt->tmpbuffer_len)
+ return;
+ vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
va_start(args, fmt);
vterm_push_output_vsprintf(vt, fmt, args);
va_end(args);
- vterm_push_output_sprintf_ctrl(vt, C1_ST, "");
-
- if(outbuffer_is_full(vt))
- vt->outbuffer_cur = orig_cur;
+ if(!vt->mode.ctrl8bit)
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ ESC_S "%c", C1_ST - 0x40);
+ else
+ cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+ "%c", C1_ST);
+ if(cur >= vt->tmpbuffer_len)
+ return;
+ vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
}
size_t vterm_output_get_buffer_size(const VTerm *vt)
diff --git a/src/libvterm/src/vterm_internal.h b/src/libvterm/src/vterm_internal.h
index e2b8b15..6aa1e9c 100644
--- a/src/libvterm/src/vterm_internal.h
+++ b/src/libvterm/src/vterm_internal.h
@@ -211,6 +211,9 @@
size_t outbuffer_len;
size_t outbuffer_cur;
+ char *tmpbuffer;
+ size_t tmpbuffer_len;
+
VTermState *state;
VTermScreen *screen;
diff --git a/src/libvterm/t/25state_input.test b/src/libvterm/t/25state_input.test
index a5119fb..4eb4c6a 100644
--- a/src/libvterm/t/25state_input.test
+++ b/src/libvterm/t/25state_input.test
@@ -111,6 +111,18 @@
INKEY 0 Enter
output "\x0d\x0a"
+!Unmodified F1 is SS3 P
+INKEY 0 F1
+ output "\eOP"
+
+!Modified F1 is CSI P
+INKEY S F1
+ output "\e[1;2P"
+INKEY A F1
+ output "\e[1;3P"
+INKEY C F1
+ output "\e[1;5P"
+
!Keypad in DECKPNM
INKEY 0 KP0
output "0"
diff --git a/src/libvterm/t/26state_query.test b/src/libvterm/t/26state_query.test
index 3ace2d5..c6be90b 100644
--- a/src/libvterm/t/26state_query.test
+++ b/src/libvterm/t/26state_query.test
@@ -59,4 +59,4 @@
!Truncation on attempted buffer overflow
PUSH "\e[6n" x 30
- output "\e[10;10R" x 24
+ output "\e[10;10R" x 25
diff --git a/src/libvterm/t/harness.c b/src/libvterm/t/harness.c
index 75869d7..e28bb7d 100644
--- a/src/libvterm/t/harness.c
+++ b/src/libvterm/t/harness.c
@@ -47,6 +47,7 @@
{ "Tab", VTERM_KEY_TAB },
{ "Enter", VTERM_KEY_ENTER },
{ "KP0", VTERM_KEY_KP_0 },
+ { "F1", VTERM_KEY_FUNCTION(1) },
{ NULL, VTERM_KEY_NONE },
};
int i;
diff --git a/src/version.c b/src/version.c
index f047bde..ee9a393 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 783,
+/**/
782,
/**/
781,