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;