To: vim_dev@googlegroups.com Subject: Patch 8.2.0784 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0784 Problem: Libvterm code lags behind the upstream version. Solution: Include revisions 730 - 733. Files: src/libvterm/src/vterm.c, src/libvterm/src/state.c, src/libvterm/include/vterm.h, src/libvterm/src/vterm_internal.h, src/libvterm/t/harness.c *** ../vim-8.2.0783/src/libvterm/src/vterm.c 2020-05-17 20:52:40.733955160 +0200 --- src/libvterm/src/vterm.c 2020-05-17 21:32:13.673312302 +0200 *************** *** 64,69 **** --- 64,72 ---- return NULL; } + vt->outfunc = NULL; + vt->outdata = NULL; + vt->outbuffer_len = 200; vt->outbuffer_cur = 0; vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len); *************** *** 135,142 **** --- 138,156 ---- vt->mode.utf8 = is_utf8; } + void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void *user) + { + vt->outfunc = func; + vt->outdata = user; + } + INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) { + if(vt->outfunc) { + (vt->outfunc)(bytes, len, vt->outdata); + return; + } + if(len > vt->outbuffer_len - vt->outbuffer_cur) { DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping output\n"); return; *************** *** 146,169 **** 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; --- 160,165 ---- *************** *** 214,225 **** 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); --- 210,218 ---- size_t cur; va_list args; ! cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, ! vt->mode.ctrl8bit ? "\x90" : ESC_S "P"); // DCS ! if(cur >= vt->tmpbuffer_len) return; vterm_push_output_bytes(vt, vt->tmpbuffer, cur); *************** *** 228,239 **** 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); --- 221,228 ---- vterm_push_output_vsprintf(vt, fmt, args); va_end(args); ! cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, ! vt->mode.ctrl8bit ? "\x9C" : ESC_S "\\"); // ST if(cur >= vt->tmpbuffer_len) return; vterm_push_output_bytes(vt, vt->tmpbuffer, cur); *** ../vim-8.2.0783/src/libvterm/src/state.c 2020-05-17 16:03:58.500875755 +0200 --- src/libvterm/src/state.c 2020-05-17 21:25:26.042741204 +0200 *************** *** 1617,1622 **** --- 1617,1624 ---- static void request_status_string(VTermState *state, const char *command, size_t cmdlen) { + VTerm *vt = state->vt; + if(cmdlen == 1) switch(command[0]) { case 'm': // Query SGR *************** *** 1624,1645 **** long args[20]; int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); int argi; ! vterm_push_output_sprintf_ctrl(state->vt, C1_DCS, "1$r"); ! for(argi = 0; argi < argc; argi++) ! vterm_push_output_sprintf(state->vt, ! argi == argc - 1 ? "%d" : ! CSI_ARG_HAS_MORE(args[argi]) ? "%d:" : ! "%d;", ! CSI_ARG(args[argi])); ! vterm_push_output_sprintf(state->vt, "m"); ! vterm_push_output_sprintf_ctrl(state->vt, C1_ST, ""); } return; case 'r': // Query DECSTBM ! vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state)); return; case 's': // Query DECSLRM ! vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state)); return; } --- 1626,1662 ---- long args[20]; int argc = vterm_state_getpen(state, args, sizeof(args)/sizeof(args[0])); int argi; ! size_t cur = 0; ! ! cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, ! vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r ... ! if(cur >= vt->tmpbuffer_len) ! return; ! ! for(argi = 0; argi < argc; argi++) { ! cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, ! argi == argc - 1 ? "%ld" : ! CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" : ! "%ld;", ! CSI_ARG(args[argi])); ! ! if(cur >= vt->tmpbuffer_len) ! return; ! } ! ! cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur, ! vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST ! if(cur >= vt->tmpbuffer_len) ! return; ! ! vterm_push_output_bytes(vt, vt->tmpbuffer, cur); } return; case 'r': // Query DECSTBM ! vterm_push_output_sprintf_dcs(vt, "1$r%d;%dr", state->scrollregion_top+1, SCROLLREGION_BOTTOM(state)); return; case 's': // Query DECSLRM ! vterm_push_output_sprintf_dcs(vt, "1$r%d;%ds", SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state)); return; } *************** *** 1653,1663 **** } if(state->mode.cursor_blink) reply--; ! vterm_push_output_sprintf_dcs(state->vt, "1$r%d q", reply); return; } else if(strneq(command, "\"q", 2)) { ! vterm_push_output_sprintf_dcs(state->vt, "1$r%d\"q", state->protected_cell ? 1 : 2); return; } } --- 1670,1680 ---- } if(state->mode.cursor_blink) reply--; ! vterm_push_output_sprintf_dcs(vt, "1$r%d q", reply); return; } else if(strneq(command, "\"q", 2)) { ! vterm_push_output_sprintf_dcs(vt, "1$r%d\"q", state->protected_cell ? 1 : 2); return; } } *** ../vim-8.2.0783/src/libvterm/include/vterm.h 2019-12-04 22:09:41.000000000 +0100 --- src/libvterm/include/vterm.h 2020-05-17 21:30:06.857756057 +0200 *************** *** 194,203 **** --- 194,210 ---- size_t vterm_input_write(VTerm *vt, const char *bytes, size_t len); + /* Setting output callback will override the buffer logic */ + typedef void VTermOutputCallback(const char *s, size_t len, void *user); + void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void *user); + + /* These buffer functions only work if output callback is NOT set + * These are deprecated and will be removed in a later version */ size_t vterm_output_get_buffer_size(const VTerm *vt); size_t vterm_output_get_buffer_current(const VTerm *vt); size_t vterm_output_get_buffer_remaining(const VTerm *vt); + /* This too */ size_t vterm_output_read(VTerm *vt, char *buffer, size_t len); int vterm_is_modify_other_keys(VTerm *vt); *** ../vim-8.2.0783/src/libvterm/src/vterm_internal.h 2020-05-17 20:52:40.733955160 +0200 --- src/libvterm/src/vterm_internal.h 2020-05-17 21:30:06.857756057 +0200 *************** *** 207,212 **** --- 207,215 ---- // len == malloc()ed size; cur == number of valid bytes + VTermOutputCallback *outfunc; + void *outdata; + char *outbuffer; size_t outbuffer_len; size_t outbuffer_cur; *************** *** 268,271 **** --- 271,294 ---- int vterm_unicode_is_ambiguous(uint32_t codepoint); int vterm_get_special_pty_type(void); + #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \ + || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) + # undef VSNPRINTF + # define VSNPRINTF vsnprintf + # undef 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 + #ifndef SNPRINTF + # define SNPRINTF snprintf + #endif + + #endif *** ../vim-8.2.0783/src/libvterm/t/harness.c 2020-05-17 20:52:40.733955160 +0200 --- src/libvterm/t/harness.c 2020-05-17 21:44:50.631596712 +0200 *************** *** 483,488 **** --- 483,491 ---- if(streq(line, "INIT")) { if(!vt) vt = vterm_new(25, 80); + + // Somehow this makes tests fail + // vterm_output_set_callback(vt, term_output, NULL); } else if(streq(line, "WANTPARSER")) { *** ../vim-8.2.0783/src/version.c 2020-05-17 20:52:40.733955160 +0200 --- src/version.c 2020-05-17 21:48:32.038954920 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 784, /**/ -- hundred-and-one symptoms of being an internet addict: 122. You ask if the Netaholics Anonymous t-shirt you ordered can be sent to you via e-mail. /// 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 ///