Commit cefffd618f60a9a8f7b7c82ac06a7a9c0a5a9f48

Sam Lantinga 2013-09-05T06:59:34

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.

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;
                     }