Mercurial > vim
comparison src/libvterm/src/vterm.c @ 20458:ffadba5f898c v8.2.0783
patch 8.2.0783: libvterm code lags behind the upstream version
Commit: https://github.com/vim/vim/commit/c4c9f7e43e7229c78919a5618003ce8aac3e1785
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun May 17 20:52:45 2020 +0200
patch 8.2.0783: libvterm code lags behind the upstream version
Problem: Libvterm code lags behind the upstream version.
Solution: Include revisions 728 - 729.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 17 May 2020 21:00:03 +0200 |
parents | 3be01cf0a632 |
children | c15dd3da4f47 |
comparison
equal
deleted
inserted
replaced
20457:a71f1962f5da | 20458:ffadba5f898c |
---|---|
72 vterm_allocator_free(vt, vt->parser.strbuffer); | 72 vterm_allocator_free(vt, vt->parser.strbuffer); |
73 vterm_allocator_free(vt, vt); | 73 vterm_allocator_free(vt, vt); |
74 return NULL; | 74 return NULL; |
75 } | 75 } |
76 | 76 |
77 vt->tmpbuffer_len = 64; | |
78 vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len); | |
79 | |
77 return vt; | 80 return vt; |
78 } | 81 } |
79 | 82 |
80 void vterm_free(VTerm *vt) | 83 void vterm_free(VTerm *vt) |
81 { | 84 { |
133 } | 136 } |
134 | 137 |
135 INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) | 138 INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t len) |
136 { | 139 { |
137 if(len > vt->outbuffer_len - vt->outbuffer_cur) { | 140 if(len > vt->outbuffer_len - vt->outbuffer_cur) { |
138 DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n"); | 141 DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping output\n"); |
139 len = vt->outbuffer_len - vt->outbuffer_cur; | 142 return; |
140 } | 143 } |
141 | 144 |
142 memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); | 145 memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len); |
143 vt->outbuffer_cur += len; | 146 vt->outbuffer_cur += len; |
144 } | |
145 | |
146 static int outbuffer_is_full(VTerm *vt) | |
147 { | |
148 return vt->outbuffer_cur >= vt->outbuffer_len - 1; | |
149 } | 147 } |
150 | 148 |
151 #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \ | 149 #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \ |
152 || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) | 150 || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) |
153 # undef VSNPRINTF | 151 # undef VSNPRINTF |
154 # define VSNPRINTF vsnprintf | 152 # define VSNPRINTF vsnprintf |
153 # undef SNPRINTF | |
154 # define SNPRINTF snprintf | |
155 #else | 155 #else |
156 # ifdef VSNPRINTF | 156 # ifdef VSNPRINTF |
157 // Use a provided vsnprintf() function. | 157 // Use a provided vsnprintf() function. |
158 int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap); | 158 int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap); |
159 # endif | 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 | |
160 #endif | 164 #endif |
161 | 165 |
162 | 166 |
163 INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) | 167 INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args) |
164 { | 168 { |
165 int written; | 169 size_t len; |
166 #ifndef VSNPRINTF | 170 #ifndef VSNPRINTF |
167 // When vsnprintf() is not available (C90) fall back to vsprintf(). | 171 // When vsnprintf() is not available (C90) fall back to vsprintf(). |
168 char buffer[1024]; // 1Kbyte is enough for everybody, right? | 172 char buffer[1024]; // 1Kbyte is enough for everybody, right? |
169 #endif | 173 #endif |
170 | 174 |
171 if(outbuffer_is_full(vt)) { | |
172 DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n"); | |
173 return; | |
174 } | |
175 | |
176 #ifdef VSNPRINTF | 175 #ifdef VSNPRINTF |
177 written = VSNPRINTF(vt->outbuffer + vt->outbuffer_cur, | 176 len = VSNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, format, args); |
178 vt->outbuffer_len - vt->outbuffer_cur, | 177 vterm_push_output_bytes(vt, vt->tmpbuffer, len); |
179 format, args); | |
180 | |
181 if(written == (int)(vt->outbuffer_len - vt->outbuffer_cur)) { | |
182 // output was truncated | |
183 vt->outbuffer_cur = vt->outbuffer_len - 1; | |
184 } | |
185 else | |
186 vt->outbuffer_cur += written; | |
187 #else | 178 #else |
188 written = vsprintf(buffer, format, args); | 179 len = vsprintf(buffer, format, args); |
189 | 180 vterm_push_output_bytes(vt, buffer, len); |
190 if(written >= (int)(vt->outbuffer_len - vt->outbuffer_cur - 1)) { | |
191 // output was truncated | |
192 written = vt->outbuffer_len - vt->outbuffer_cur - 1; | |
193 } | |
194 if (written > 0) | |
195 { | |
196 strncpy(vt->outbuffer + vt->outbuffer_cur, buffer, written + 1); | |
197 vt->outbuffer_cur += written; | |
198 } | |
199 #endif | 181 #endif |
200 } | 182 } |
201 | 183 |
202 INTERNAL void vterm_push_output_sprintf(VTerm *vt, const char *format, ...) | 184 INTERNAL void vterm_push_output_sprintf(VTerm *vt, const char *format, ...) |
203 { | 185 { |
207 va_end(args); | 189 va_end(args); |
208 } | 190 } |
209 | 191 |
210 INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...) | 192 INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, const char *fmt, ...) |
211 { | 193 { |
212 size_t orig_cur = vt->outbuffer_cur; | 194 size_t cur; |
213 va_list args; | 195 va_list args; |
214 | 196 |
215 if(ctrl >= 0x80 && !vt->mode.ctrl8bit) | 197 if(ctrl >= 0x80 && !vt->mode.ctrl8bit) |
216 vterm_push_output_sprintf(vt, ESC_S "%c", ctrl - 0x40); | 198 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
199 ESC_S "%c", ctrl - 0x40); | |
217 else | 200 else |
218 vterm_push_output_sprintf(vt, "%c", ctrl); | 201 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
202 "%c", ctrl); | |
203 if(cur >= vt->tmpbuffer_len) | |
204 return; | |
205 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | |
219 | 206 |
220 va_start(args, fmt); | 207 va_start(args, fmt); |
221 vterm_push_output_vsprintf(vt, fmt, args); | 208 vterm_push_output_vsprintf(vt, fmt, args); |
222 va_end(args); | 209 va_end(args); |
223 | |
224 if(outbuffer_is_full(vt)) | |
225 vt->outbuffer_cur = orig_cur; | |
226 } | 210 } |
227 | 211 |
228 INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...) | 212 INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...) |
229 { | 213 { |
230 size_t orig_cur = vt->outbuffer_cur; | 214 size_t cur; |
231 va_list args; | 215 va_list args; |
232 | 216 |
233 if(!vt->mode.ctrl8bit) | 217 if(!vt->mode.ctrl8bit) |
234 vterm_push_output_sprintf(vt, ESC_S "%c", C1_DCS - 0x40); | 218 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
219 ESC_S "%c", C1_DCS - 0x40); | |
235 else | 220 else |
236 vterm_push_output_sprintf(vt, "%c", C1_DCS); | 221 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
222 "%c", C1_DCS); | |
223 if(cur >= vt->tmpbuffer_len) | |
224 return; | |
225 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | |
237 | 226 |
238 va_start(args, fmt); | 227 va_start(args, fmt); |
239 vterm_push_output_vsprintf(vt, fmt, args); | 228 vterm_push_output_vsprintf(vt, fmt, args); |
240 va_end(args); | 229 va_end(args); |
241 | 230 |
242 vterm_push_output_sprintf_ctrl(vt, C1_ST, ""); | 231 if(!vt->mode.ctrl8bit) |
243 | 232 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, |
244 if(outbuffer_is_full(vt)) | 233 ESC_S "%c", C1_ST - 0x40); |
245 vt->outbuffer_cur = orig_cur; | 234 else |
235 cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, | |
236 "%c", C1_ST); | |
237 if(cur >= vt->tmpbuffer_len) | |
238 return; | |
239 vterm_push_output_bytes(vt, vt->tmpbuffer, cur); | |
246 } | 240 } |
247 | 241 |
248 size_t vterm_output_get_buffer_size(const VTerm *vt) | 242 size_t vterm_output_get_buffer_size(const VTerm *vt) |
249 { | 243 { |
250 return vt->outbuffer_len; | 244 return vt->outbuffer_len; |