From 987aa3113c2f91c47d21c2e6e2c4c0e256ac84f2 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 26 Sep 2019 12:55:05 -0400 Subject: [PATCH] stdlib: Try to coerce VS2019 to not replace some loops with memset() calls. Fixes (?) Bugzilla #4759. --- src/stdlib/SDL_string.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c index fdce1353377ed..65cf85e00e90e 100644 --- a/src/stdlib/SDL_string.c +++ b/src/stdlib/SDL_string.c @@ -1387,15 +1387,18 @@ SDL_PrintString(char *text, size_t maxlen, SDL_FormatInfo *info, const char *str sz = SDL_strlen(string); if (info && info->width > 0 && (size_t)info->width > sz) { - char fill = info->pad_zeroes ? '0' : ' '; + const char fill = info->pad_zeroes ? '0' : ' '; size_t width = info->width - sz; + size_t filllen; + if (info->precision >= 0 && (size_t)info->precision < sz) width += sz - (size_t)info->precision; - while (width-- > 0 && maxlen > 0) { - *text++ = fill; - ++length; - --maxlen; - } + + filllen = SDL_min(width, maxlen); + SDL_memset(text, fill, filllen); + text += filllen; + length += filllen; + maxlen -= filllen; } slen = SDL_strlcpy(text, string, maxlen); @@ -1580,7 +1583,7 @@ SDL_PrintFloat(char *text, size_t maxlen, SDL_FormatInfo *info, double arg) width = info->width - (int)(text - textstart); if (width > 0) { - char fill = info->pad_zeroes ? '0' : ' '; + const char fill = info->pad_zeroes ? '0' : ' '; char *end = text+left-1; len = (text - textstart); for (len = (text - textstart); len--; ) { @@ -1596,10 +1599,10 @@ SDL_PrintFloat(char *text, size_t maxlen, SDL_FormatInfo *info, double arg) text += len; left -= len; } - while (len--) { - if (textstart+len < end) { - textstart[len] = fill; - } + + if (end != textstart) { + const size_t filllen = SDL_min(len, ((size_t) (end - textstart)) - 1); + SDL_memset(textstart, fill, fillen); } }