diff src/libvterm/src/vterm.c @ 20458:ffadba5f898c v8.2.0783

patch 8.2.0783: libvterm code lags behind the upstream version Commit: https://github.com/vim/vim/commit/c4c9f7e43e7229c78919a5618003ce8aac3e1785 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 17 20:52:45 2020 +0200 patch 8.2.0783: libvterm code lags behind the upstream version Problem: Libvterm code lags behind the upstream version. Solution: Include revisions 728 - 729.
author Bram Moolenaar <Bram@vim.org>
date Sun, 17 May 2020 21:00:03 +0200
parents 3be01cf0a632
children c15dd3da4f47
line wrap: on
line diff
--- a/src/libvterm/src/vterm.c
+++ b/src/libvterm/src/vterm.c
@@ -74,6 +74,9 @@ VTerm *vterm_new_with_allocator(int rows
     return NULL;
   }
 
+  vt->tmpbuffer_len = 64;
+  vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len);
+
   return vt;
 }
 
@@ -135,67 +138,46 @@ void vterm_set_utf8(VTerm *vt, int is_ut
 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(
 
 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);
+}
+
+INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...)
+{
+  size_t cur;
+  va_list args;
+
+  if(!vt->mode.ctrl8bit)
+    cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
+        ESC_S "%c", C1_DCS - 0x40);
+  else
+    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);
 
-  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;
-  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_ST - 0x40);
   else
-    vterm_push_output_sprintf(vt, "%c", C1_DCS);
-
-  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;
+    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)