Mercurial > vim
comparison src/libvterm/src/vterm.c @ 20460:c15dd3da4f47 v8.2.0784
patch 8.2.0784: libvterm code lags behind the upstream version
Commit: https://github.com/vim/vim/commit/94d729cbe8f0f788d9d7539f733cff395e73b228
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun May 17 21:50:16 2020 +0200
patch 8.2.0784: libvterm code lags behind the upstream version
Problem: Libvterm code lags behind the upstream version.
Solution: Include revisions 730 - 733.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 17 May 2020 22:00:04 +0200 |
parents | ffadba5f898c |
children | 9ad473b50471 |
comparison
equal
deleted
inserted
replaced
20459:8d6f1cfef895 | 20460:c15dd3da4f47 |
---|---|
61 if (vt->parser.strbuffer == NULL) | 61 if (vt->parser.strbuffer == NULL) |
62 { | 62 { |
63 vterm_allocator_free(vt, vt); | 63 vterm_allocator_free(vt, vt); |
64 return NULL; | 64 return NULL; |
65 } | 65 } |
66 | |
67 vt->outfunc = NULL; | |
68 vt->outdata = NULL; | |
66 | 69 |
67 vt->outbuffer_len = 200; | 70 vt->outbuffer_len = 200; |
68 vt->outbuffer_cur = 0; | 71 vt->outbuffer_cur = 0; |
69 vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len); | 72 vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len); |
70 if (vt->outbuffer == NULL) | 73 if (vt->outbuffer == NULL) |
133 void vterm_set_utf8(VTerm *vt, int is_utf8) | 136 void vterm_set_utf8(VTerm *vt, int is_utf8) |
134 { | 137 { |
135 vt->mode.utf8 = is_utf8; | 138 vt->mode.utf8 = is_utf8; |
136 } | 139 } |
137 | 140 |
141 void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void *user) | |
142 { | |
143 vt->outfunc = func; | |
144 vt->outdata = user; | |
145 } | |
146 | |
138 INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) | 147 INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) |
139 { | 148 { |
149 if(vt->outfunc) { | |
150 (vt->outfunc)(bytes, len, vt->outdata); | |
151 return; | |
152 } | |
153 | |
140 if(len > vt->outbuffer_len - vt->outbuffer_cur) { | 154 if(len > vt->outbuffer_len - vt->outbuffer_cur) { |
141 DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping output\n"); | 155 DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping output\n"); |
142 return; | 156 return; |
143 } | 157 } |
144 | 158 |
145 memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); | 159 memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); |
146 vt->outbuffer_cur += len; | 160 vt->outbuffer_cur += len; |
147 } | 161 } |
148 | |
149 #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \ | |
150 || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) | |
151 # undef VSNPRINTF | |
152 # define VSNPRINTF vsnprintf | |
153 # undef SNPRINTF | |
154 # define SNPRINTF snprintf | |
155 #else | |
156 # ifdef VSNPRINTF | |
157 // Use a provided vsnprintf() function. | |
158 int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap); | |
159 # endif | |
160 # ifdef SNPRINTF | |
161 // Use a provided snprintf() function. | |
162 int SNPRINTF(char *str, size_t str_m, const char *fmt, ...); | |
163 # endif | |
164 #endif | |
165 | |
166 | 162 |
167 INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) | 163 INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) |
168 { | 164 { |
169 size_t len; | 165 size_t len; |
170 #ifndef VSNPRINTF | 166 #ifndef VSNPRINTF |
212 INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...) | 208 INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...) |
213 { | 209 { |
214 size_t cur; | 210 size_t cur; |
215 va_list args; | 211 va_list args; |
216 | 212 |
217 if(!vt->mode.ctrl8bit) | 213 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
218 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, | 214 vt->mode.ctrl8bit ? "\x90" : ESC_S "P"); // DCS |
219 ESC_S "%c", C1_DCS - 0x40); | 215 |
220 else | |
221 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, | |
222 "%c", C1_DCS); | |
223 if(cur >= vt->tmpbuffer_len) | 216 if(cur >= vt->tmpbuffer_len) |
224 return; | 217 return; |
225 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | 218 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); |
226 | 219 |
227 va_start(args, fmt); | 220 va_start(args, fmt); |
228 vterm_push_output_vsprintf(vt, fmt, args); | 221 vterm_push_output_vsprintf(vt, fmt, args); |
229 va_end(args); | 222 va_end(args); |
230 | 223 |
231 if(!vt->mode.ctrl8bit) | 224 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
232 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, | 225 vt->mode.ctrl8bit ? "\x9C" : ESC_S "\\"); // ST |
233 ESC_S "%c", C1_ST - 0x40); | |
234 else | |
235 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, | |
236 "%c", C1_ST); | |
237 if(cur >= vt->tmpbuffer_len) | 226 if(cur >= vt->tmpbuffer_len) |
238 return; | 227 return; |
239 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | 228 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); |
240 } | 229 } |
241 | 230 |