]> granicus.if.org Git - vim/commitdiff
patch 8.2.0783: libvterm code lags behind the upstream version v8.2.0783
authorBram Moolenaar <Bram@vim.org>
Sun, 17 May 2020 18:52:45 +0000 (20:52 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 17 May 2020 18:52:45 +0000 (20:52 +0200)
Problem:    Libvterm code lags behind the upstream version.
Solution:   Include revisions 728 - 729.

src/Make_cyg_ming.mak
src/Make_mvc.mak
src/Makefile
src/libvterm/src/keyboard.c
src/libvterm/src/vterm.c
src/libvterm/src/vterm_internal.h
src/libvterm/t/25state_input.test
src/libvterm/t/26state_query.test
src/libvterm/t/harness.c
src/version.c

index 94561e51b20eb69e36a7535672e87ec67955b93d..517ed2bfbc1d26c36f861def2c7ebf78bf53492e 100644 (file)
@@ -1246,6 +1246,7 @@ $(OUTDIR)/pathdef.o:      $(PATHDEF_SRC) $(INCL)
 
 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
index c93517b9808fecd370f9533d7ee5e8b7472bea19..8240f505688ec6971e0f96bac5b895ec403f76cd 100644 (file)
@@ -1812,6 +1812,7 @@ $(OUTDIR)/glbl_ime.obj:   $(OUTDIR) glbl_ime.cpp  dimm.h $(INCL)
 
 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 \
index 7c2934aea3d89ba12edb1d5c323a071f03a20e1c..ad8f241de700efb21779b81e85472237e53fa3f4 100644 (file)
@@ -3537,6 +3537,7 @@ Makefile:
 # 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
 
index 95b962ed6410cd985a027c49395b89d09c16532d..9c2a53d7b1334f84b8aadf222bb7fd8ba7585349 100644 (file)
@@ -102,10 +102,10 @@ static keycodes_s keycodes[] = {
 
 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
index 1d6a977f1b77bd7ecbd113a83dcd03e52491ec50..56c4e28d99764ddb347eef404fe3fc890a2dcb3b 100644 (file)
@@ -74,6 +74,9 @@ VTerm *vterm_new_with_allocator(int rows, int cols, VTermAllocatorFunctions *fun
     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_utf8)
 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(VTerm *vt, const char *format, ...)
 
 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)
index e2b8b159beb077571523003ef3a0fde6451f24d2..6aa1e9cc4843441ada0bdbbc89288b3bb7b3021f 100644 (file)
@@ -211,6 +211,9 @@ struct VTerm
   size_t outbuffer_len;
   size_t outbuffer_cur;
 
+  char  *tmpbuffer;
+  size_t tmpbuffer_len;
+
   VTermState *state;
   VTermScreen *screen;
 
index a5119fbd87af614f37c613c6b18276d2f3f9014a..4eb4c6abdfe77ee85297181fe176c281a843c679 100644 (file)
@@ -111,6 +111,18 @@ PUSH "\e[20h"
 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"
index 3ace2d53234c1ea7ee8f763e0e3daf3f8e297f48..c6be90b619203b2dc40f95a41444751ac2189227 100644 (file)
@@ -59,4 +59,4 @@ PUSH "\e F"
 
 !Truncation on attempted buffer overflow
 PUSH "\e[6n" x 30
-  output "\e[10;10R" x 24
+  output "\e[10;10R" x 25
index 75869d756cbc990ebe1433fb7e71456278be9d5f..e28bb7d3089581147d9dbf3b58474e1c9afd5f61 100644 (file)
@@ -47,6 +47,7 @@ static VTermKey strp_key(char *str)
     { "Tab",   VTERM_KEY_TAB },
     { "Enter", VTERM_KEY_ENTER },
     { "KP0",   VTERM_KEY_KP_0 },
+    { "F1",    VTERM_KEY_FUNCTION(1) },
     { NULL,    VTERM_KEY_NONE },
   };
   int i;
index f047bde5749e9693d0f34850a4f9df0fc3881a01..ee9a3935833e41b6e6a0477aa13cd549441b8f82 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    783,
 /**/
     782,
 /**/