lib: sbi: Fix printi
authorXiang W <wxjstz@126.com>
Sun, 9 Jul 2023 16:02:27 +0000 (00:02 +0800)
committerAnup Patel <anup@brainfault.org>
Wed, 12 Jul 2023 04:31:43 +0000 (10:01 +0530)
Fix two bug:
> printf("%#08x", 0x123); /* print 0000x123 */
> printf("%#x", 0); /* print 0x0 */

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
lib/sbi/sbi_console.c

index 10b27c621c40fb969331ef6edba8b0a573cd5bdc..9e9f273f54d4fc6024c44a8f848211be6bdee908 100644 (file)
@@ -227,23 +227,33 @@ static int printi(char **out, u32 *out_len, long long i,
                }
        }
 
-       if (flags & PAD_ALTERNATE) {
-               if ((b == 16) && (letbase == 'A')) {
-                       *--s = 'X';
-               } else if ((b == 16) && (letbase == 'a')) {
-                       *--s = 'x';
-               }
-               *--s = '0';
-       }
-
-       if (sign) {
-               if (width && (flags & PAD_ZERO)) {
+       if (flags & PAD_ZERO) {
+               if (sign) {
                        printc(out, out_len, sign);
                        ++pc;
                        --width;
-               } else {
-                       *--s = sign;
                }
+               if (i && (flags & PAD_ALTERNATE)) {
+                       if (b == 16 || b == 8) {
+                               printc(out, out_len, '0');
+                               ++pc;
+                               --width;
+                       }
+                       if (b == 16) {
+                               printc(out, out_len, 'x' - 'a' + letbase);
+                               ++pc;
+                               --width;
+                       }
+               }
+       } else {
+               if (i && (flags & PAD_ALTERNATE)) {
+                       if (b == 16)
+                               *--s = 'x' - 'a' + letbase;
+                       if (b == 16 || b == 8)
+                               *--s = '0';
+               }
+               if (sign)
+                       *--s = sign;
        }
 
        return pc + prints(out, out_len, s, width, flags);