From cefffd618f60a9a8f7b7c82ac06a7a9c0a5a9f48 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 5 Sep 2013 06:59:34 -0700 Subject: [PATCH] Fixed bug 2082 - SDL stdlib implementation does not force upper case for %X format specifier norfanin When SDL_vsnprintf handles the %x format specifier, a boolean is set to signal forced lower case. It also should be able to signal forced upper case for the %X specifier. A boolean is not sufficient anymore. The attached patch adds an enum for the three cases: lower, upper and no change. --- src/stdlib/SDL_string.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c index 89f5f358eb87d..980f025aebf68 100644 --- a/src/stdlib/SDL_string.c +++ b/src/stdlib/SDL_string.c @@ -1293,13 +1293,20 @@ int SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap) } #else /* FIXME: implement more of the format specifiers */ +typedef enum +{ + SDL_CASE_NOCHANGE, + SDL_CASE_LOWER, + SDL_CASE_UPPER +} SDL_letter_case; + typedef struct { SDL_bool left_justify; SDL_bool force_sign; SDL_bool force_type; SDL_bool pad_zeroes; - SDL_bool do_lowercase; + SDL_letter_case force_case; int width; int radix; int precision; @@ -1322,8 +1329,12 @@ SDL_PrintString(char *text, size_t maxlen, SDL_FormatInfo *info, const char *str length += SDL_strlcpy(text, string, maxlen); - if (info && info->do_lowercase) { - SDL_strlwr(text); + if (info) { + if (info->force_case == SDL_CASE_LOWER) { + SDL_strlwr(text); + } else if (info->force_case == SDL_CASE_UPPER) { + SDL_strupr(text); + } } return length; } @@ -1573,9 +1584,12 @@ SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap) break; case 'p': case 'x': - info.do_lowercase = SDL_TRUE; + info.force_case = SDL_CASE_LOWER; /* Fall through to 'X' handling */ case 'X': + if (info.force_case == SDL_CASE_NOCHANGE) { + info.force_case = SDL_CASE_UPPER; + } if (info.radix == 10) { info.radix = 16; }