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