Fixed bug 2082 - SDL stdlib implementation does not force upper case for %X format specifier
authorSam Lantinga <slouken@libsdl.org>
Thu, 05 Sep 2013 06:59:34 -0700
changeset 7728 800313a3533d
parent 7727 627ce8499c81
child 7729 384d5ba7ee44
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
--- a/src/stdlib/SDL_string.c	Thu Sep 05 06:43:34 2013 -0700
+++ b/src/stdlib/SDL_string.c	Thu Sep 05 06:59:34 2013 -0700
@@ -1293,13 +1293,20 @@
 }
 #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 @@
 
     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 @@
                     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;
                     }