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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
diff --git a/src/stdlib/SDL_string.c b/src/stdlib/SDL_string.c
index 89f5f35..980f025 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;
}