Skip to content

Commit

Permalink
SDL_vsnprintf: fix numerics if both zero-padding and a field are given.
Browse files Browse the repository at this point in the history
it used to place zeroes between the sign and the number. (space-padding
from within SDL_PrintString() seems OK:  spaces are added before sign.)

also fixed the maxlen handling if the number has a sign.
  • Loading branch information
sezero committed Sep 28, 2018
1 parent 5454765 commit 49803c8
Showing 1 changed file with 20 additions and 4 deletions.
24 changes: 20 additions & 4 deletions src/stdlib/SDL_string.c
Expand Up @@ -1416,22 +1416,38 @@ SDL_PrintString(char *text, size_t maxlen, SDL_FormatInfo *info, const char *str
static void
SDL_IntPrecisionAdjust(char *num, size_t maxlen, SDL_FormatInfo *info)
{/* left-pad num with zeroes. */
size_t sz, pad;
size_t sz, pad, have_sign;

if (!info || info->precision < 0)
if (!info)
return;

if (*num == '-')
have_sign = 0;
if (*num == '-' || *num == '+') {
have_sign = 1;
++num;
--maxlen;
}
sz = SDL_strlen(num);
if (sz < (size_t)info->precision) {
if (info->precision > 0 && sz < (size_t)info->precision) {
pad = (size_t)info->precision - sz;
if (pad + sz + 1 <= maxlen) { /* otherwise ignore the precision */
SDL_memmove(num + pad, num, sz + 1);
SDL_memset(num, '0', pad);
}
}
info->precision = -1;/* so that SDL_PrintString() doesn't make a mess. */

if (info->pad_zeroes && info->width > 0 && (size_t)info->width > sz + have_sign) {
/* handle here: spaces are added before the sign
but zeroes must be placed _after_ the sign. */
/* sz hasn't changed: we ignore pad_zeroes if a precision is given. */
pad = (size_t)info->width - sz - have_sign;
if (pad + sz + 1 <= maxlen) {
SDL_memmove(num + pad, num, sz + 1);
SDL_memset(num, '0', pad);
}
info->width = 0; /* so that SDL_PrintString() doesn't make a mess. */
}
}

static size_t
Expand Down

0 comments on commit 49803c8

Please sign in to comment.