Skip to content

Commit 8327d1d

Browse files
committed
patch 8.0.0709: libvterm cannot use vsnprintf()
Problem: Libvterm cannot use vsnprintf(), it does not exist in C90. Solution: Use vim_vsnprintf() instead.
1 parent 292eff0 commit 8327d1d

File tree

7 files changed

+51
-10
lines changed

7 files changed

+51
-10
lines changed

src/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3284,7 +3284,7 @@ objects/channel.o: channel.c
32843284
Makefile:
32853285
@echo The name of the makefile MUST be "Makefile" (with capital M)!!!!
32863286

3287-
CCCTERM = $(CCC) -Ilibvterm/include -DINLINE=""
3287+
CCCTERM = $(CCC) -Ilibvterm/include -DINLINE="" -DVSNPRINTF=vim_vsnprintf
32883288
objects/term_encoding.o: libvterm/src/encoding.c $(TERM_DEPS)
32893289
$(CCCTERM) -o $@ libvterm/src/encoding.c
32903290

src/evalfunc.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8043,14 +8043,15 @@ f_printf(typval_T *argvars, typval_T *rettv)
80438043
/* Get the required length, allocate the buffer and do it for real. */
80448044
did_emsg = FALSE;
80458045
fmt = (char *)get_tv_string_buf(&argvars[0], buf);
8046-
len = vim_vsnprintf(NULL, 0, fmt, ap, argvars + 1);
8046+
len = vim_vsnprintf_typval(NULL, 0, fmt, ap, argvars + 1);
80478047
if (!did_emsg)
80488048
{
80498049
s = alloc(len + 1);
80508050
if (s != NULL)
80518051
{
80528052
rettv->vval.v_string = s;
8053-
(void)vim_vsnprintf((char *)s, len + 1, fmt, ap, argvars + 1);
8053+
(void)vim_vsnprintf_typval((char *)s, len + 1, fmt,
8054+
ap, argvars + 1);
80548055
}
80558056
}
80568057
did_emsg |= saved_did_emsg;

src/libvterm/src/vterm.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,42 @@ static int outbuffer_is_full(VTerm *vt)
130130
return vt->outbuffer_cur >= vt->outbuffer_len - 1;
131131
}
132132

133+
#if _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE || _BSD_SOURCE
134+
# undef VSNPRINTF
135+
# define VSNPRINTF vsnprintf
136+
#else
137+
# ifdef VSNPRINTF
138+
/* Use a provided vsnprintf() function. */
139+
int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap);
140+
# endif
141+
#endif
142+
143+
133144
INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list args)
134145
{
135146
int written;
147+
#ifndef VSNPRINTF
148+
/* When vsnprintf() is not available (C90) fall back to vsprintf(). */
136149
char buffer[1024]; /* 1Kbyte is enough for everybody, right? */
150+
#endif
137151

138152
if(outbuffer_is_full(vt)) {
139153
DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n");
140154
return;
141155
}
142156

157+
#ifdef VSNPRINTF
158+
written = VSNPRINTF(vt->outbuffer + vt->outbuffer_cur,
159+
vt->outbuffer_len - vt->outbuffer_cur,
160+
format, args);
161+
162+
if(written == (int)(vt->outbuffer_len - vt->outbuffer_cur)) {
163+
/* output was truncated */
164+
vt->outbuffer_cur = vt->outbuffer_len - 1;
165+
}
166+
else
167+
vt->outbuffer_cur += written;
168+
#else
143169
written = vsprintf(buffer, format, args);
144170

145171
if(written >= (int)(vt->outbuffer_len - vt->outbuffer_cur)) {
@@ -151,6 +177,7 @@ INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, va_list
151177
strncpy(vt->outbuffer + vt->outbuffer_cur, buffer, written + 1);
152178
vt->outbuffer_cur += written;
153179
}
180+
#endif
154181
}
155182

156183
INTERNAL void vterm_push_output_sprintf(VTerm *vt, const char *format, ...)

src/message.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ smsg(char_u *s, ...)
382382
va_list arglist;
383383

384384
va_start(arglist, s);
385-
vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist, NULL);
385+
vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist);
386386
va_end(arglist);
387387
return msg(IObuff);
388388
}
@@ -396,7 +396,7 @@ smsg_attr(int attr, char_u *s, ...)
396396
va_list arglist;
397397

398398
va_start(arglist, s);
399-
vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist, NULL);
399+
vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist);
400400
va_end(arglist);
401401
return msg_attr(IObuff, attr);
402402
}
@@ -4232,7 +4232,7 @@ infinity_str(int positive,
42324232
/*
42334233
* When va_list is not supported we only define vim_snprintf().
42344234
*
4235-
* vim_vsnprintf() can be invoked with either "va_list" or a list of
4235+
* vim_vsnprintf_typval() can be invoked with either "va_list" or a list of
42364236
* "typval_T". When the latter is not used it must be NULL.
42374237
*/
42384238

@@ -4254,7 +4254,7 @@ vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
42544254
else
42554255
space = str_m - len;
42564256
va_start(ap, fmt);
4257-
str_l = vim_vsnprintf(str + len, space, fmt, ap, NULL);
4257+
str_l = vim_vsnprintf(str + len, space, fmt, ap);
42584258
va_end(ap);
42594259
return str_l;
42604260
}
@@ -4266,13 +4266,23 @@ vim_snprintf(char *str, size_t str_m, char *fmt, ...)
42664266
int str_l;
42674267

42684268
va_start(ap, fmt);
4269-
str_l = vim_vsnprintf(str, str_m, fmt, ap, NULL);
4269+
str_l = vim_vsnprintf(str, str_m, fmt, ap);
42704270
va_end(ap);
42714271
return str_l;
42724272
}
42734273

42744274
int
42754275
vim_vsnprintf(
4276+
char *str,
4277+
size_t str_m,
4278+
char *fmt,
4279+
va_list ap)
4280+
{
4281+
return vim_vsnprintf_typval(str, str_m, fmt, ap, NULL);
4282+
}
4283+
4284+
int
4285+
vim_vsnprintf_typval(
42764286
char *str,
42774287
size_t str_m,
42784288
char *fmt,

src/netbeans.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2301,7 +2301,7 @@ coloncmd(char *cmd, ...)
23012301
va_list ap;
23022302

23032303
va_start(ap, cmd);
2304-
vim_vsnprintf(buf, sizeof(buf), cmd, ap, NULL);
2304+
vim_vsnprintf(buf, sizeof(buf), cmd, ap);
23052305
va_end(ap);
23062306

23072307
nbdebug((" COLONCMD %s\n", buf));

src/proto.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ _RTLENTRYF
127127
# endif
128128
vim_snprintf(char *, size_t, char *, ...);
129129

130-
int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs);
130+
int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap);
131+
int vim_vsnprintf_typval(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs);
131132

132133
# include "message.pro"
133134
# include "misc1.pro"

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ static char *(features[]) =
764764

765765
static int included_patches[] =
766766
{ /* Add new patch number below this line */
767+
/**/
768+
709,
767769
/**/
768770
708,
769771
/**/

0 commit comments

Comments
 (0)