To: vim_dev@googlegroups.com Subject: Patch 8.2.0783 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0783 Problem: Libvterm code lags behind the upstream version. Solution: Include revisions 728 - 729. Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile, src/libvterm/src/keyboard.c, src/libvterm/t/25state_input.test, src/libvterm/t/harness.c, src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h, src/libvterm/t/26state_query.test *** ../vim-8.2.0782/src/Make_cyg_ming.mak 2020-05-01 14:26:17.124949293 +0200 --- src/Make_cyg_ming.mak 2020-05-17 20:16:51.242595200 +0200 *************** *** 1246,1251 **** --- 1246,1252 ---- 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 *** ../vim-8.2.0782/src/Make_mvc.mak 2020-05-15 18:21:47.286058929 +0200 --- src/Make_mvc.mak 2020-05-17 20:17:05.802552868 +0200 *************** *** 1812,1817 **** --- 1812,1818 ---- 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 \ *** ../vim-8.2.0782/src/Makefile 2020-05-11 22:13:24.793171617 +0200 --- src/Makefile 2020-05-17 20:17:12.986531988 +0200 *************** *** 3537,3542 **** --- 3537,3543 ---- # 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 *** ../vim-8.2.0782/src/libvterm/src/keyboard.c 2019-10-10 20:30:04.000000000 +0200 --- src/libvterm/src/keyboard.c 2020-05-17 19:08:02.490010475 +0200 *************** *** 102,111 **** 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_CSINUM, '~', 15 }, // F5 { KEYCODE_CSINUM, '~', 17 }, // F6 { KEYCODE_CSINUM, '~', 18 }, // F7 --- 102,111 ---- static keycodes_s keycodes_fn[] = { { KEYCODE_NONE, 0, 0 }, // F0 - shouldn't happen ! { 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 *** ../vim-8.2.0782/src/libvterm/t/25state_input.test 2018-03-25 14:54:41.000000000 +0200 --- src/libvterm/t/25state_input.test 2020-05-17 19:06:12.610362364 +0200 *************** *** 111,116 **** --- 111,128 ---- 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" *** ../vim-8.2.0782/src/libvterm/t/harness.c 2020-04-12 14:50:22.317438970 +0200 --- src/libvterm/t/harness.c 2020-05-17 19:06:12.610362364 +0200 *************** *** 47,52 **** --- 47,53 ---- { "Tab", VTERM_KEY_TAB }, { "Enter", VTERM_KEY_ENTER }, { "KP0", VTERM_KEY_KP_0 }, + { "F1", VTERM_KEY_FUNCTION(1) }, { NULL, VTERM_KEY_NONE }, }; int i; *** ../vim-8.2.0782/src/libvterm/src/vterm.c 2019-12-04 22:08:47.000000000 +0100 --- src/libvterm/src/vterm.c 2020-05-17 20:43:17.219953310 +0200 *************** *** 74,79 **** --- 74,82 ---- return NULL; } + vt->tmpbuffer_len = 64; + vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len); + return vt; } *************** *** 135,201 **** 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; } 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 #else # ifdef VSNPRINTF // Use a provided vsnprintf() function. int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap); # endif #endif INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) { ! int written; #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; #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; ! } #endif } --- 138,183 ---- 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_bytes(): buffer overflow; dropping output\n"); ! return; } memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); vt->outbuffer_cur += len; } #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) { ! 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 #ifdef VSNPRINTF ! len = VSNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, format, args); ! vterm_push_output_bytes(vt, vt->tmpbuffer, len); #else ! len = vsprintf(buffer, format, args); ! vterm_push_output_bytes(vt, buffer, len); #endif } *************** *** 209,248 **** INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...) { ! size_t orig_cur = vt->outbuffer_cur; va_list args; if(ctrl >= 0x80 && !vt->mode.ctrl8bit) ! vterm_push_output_sprintf(vt, ESC_S "%c", ctrl - 0x40); else ! vterm_push_output_sprintf(vt, "%c", ctrl); 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); 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; } size_t vterm_output_get_buffer_size(const VTerm *vt) --- 191,242 ---- INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...) { ! size_t cur; va_list args; if(ctrl >= 0x80 && !vt->mode.ctrl8bit) ! cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, ! ESC_S "%c", ctrl - 0x40); else ! 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(!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) *** ../vim-8.2.0782/src/libvterm/src/vterm_internal.h 2019-10-10 19:44:39.000000000 +0200 --- src/libvterm/src/vterm_internal.h 2020-05-17 19:10:17.189581332 +0200 *************** *** 211,216 **** --- 211,219 ---- size_t outbuffer_len; size_t outbuffer_cur; + char *tmpbuffer; + size_t tmpbuffer_len; + VTermState *state; VTermScreen *screen; *** ../vim-8.2.0782/src/libvterm/t/26state_query.test 2019-08-18 20:58:44.000000000 +0200 --- src/libvterm/t/26state_query.test 2020-05-17 19:28:35.090835607 +0200 *************** *** 59,62 **** !Truncation on attempted buffer overflow PUSH "\e[6n" x 30 ! output "\e[10;10R" x 24 --- 59,62 ---- !Truncation on attempted buffer overflow PUSH "\e[6n" x 30 ! output "\e[10;10R" x 25 *** ../vim-8.2.0782/src/version.c 2020-05-17 18:53:22.104931177 +0200 --- src/version.c 2020-05-17 20:51:43.394153355 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 783, /**/ -- hundred-and-one symptoms of being an internet addict: 121. You ask for e-mail adresses instead of telephone numbers. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///