diff --git a/app/tests/printf_tests.c b/app/tests/printf_tests.c index a826d90c..bb1e9b22 100644 --- a/app/tests/printf_tests.c +++ b/app/tests/printf_tests.c @@ -38,16 +38,14 @@ void printf_tests(void) printf("long: %ld %ld %ld\n", -12345678L, 0L, 12345678L); printf("ulong: %lu %lu %lu\n", -12345678UL, 0UL, 12345678UL); - // GCC has a problem with the next two lines -#if 0 - printf("long: %D %D %D\n", -12345678L, 0L, 12345678L); - printf("ulong: %U %U %U\n", -12345678UL, 0UL, 12345678UL); -#endif - printf("longlong: %lli %lli %lli\n", -12345678LL, 0LL, 12345678LL); printf("ulonglong: %llu %llu %llu\n", -12345678LL, 0LL, 12345678LL); printf("ssize_t: %zd %zd %zd\n", (ssize_t)-12345678, (ssize_t)0, (ssize_t)12345678); printf("usize_t: %zu %zu %zu\n", (size_t)-12345678, (size_t)0, (size_t)12345678); + printf("intmax_t: %jd %jd %jd\n", (intmax_t)-12345678, (intmax_t)0, (intmax_t)12345678); + printf("uintmax_t: %ju %ju %ju\n", (uintmax_t)-12345678, (uintmax_t)0, (uintmax_t)12345678); + printf("ptrdiff_t: %td %td %td\n", (ptrdiff_t)-12345678, (ptrdiff_t)0, (ptrdiff_t)12345678); + printf("ptrdiff_t (u): %tu %tu %tu\n", (ptrdiff_t)-12345678, (ptrdiff_t)0, (ptrdiff_t)12345678); printf("hex:\n"); printf("uint8: %hhx %hhx %hhx\n", -12, 0, 254); @@ -61,6 +59,7 @@ void printf_tests(void) printf("alt/sign:\n"); printf("uint: %#x %#X\n", 0xabcdef, 0xabcdef); printf("int: %+d %+d\n", 12345678, -12345678); + printf("int: % d %+d\n", 12345678, 12345678); printf("formatting\n"); printf("int: a%8da\n", 12345678); diff --git a/lib/libc/printf.c b/lib/libc/printf.c index d8f416c8..809486b9 100644 --- a/lib/libc/printf.c +++ b/lib/libc/printf.c @@ -80,17 +80,20 @@ int snprintf(char *str, size_t len, const char *fmt, ...) } -#define LONGFLAG 0x00000001 -#define LONGLONGFLAG 0x00000002 -#define HALFFLAG 0x00000004 -#define HALFHALFFLAG 0x00000008 -#define SIZETFLAG 0x00000010 -#define ALTFLAG 0x00000020 -#define CAPSFLAG 0x00000040 -#define SHOWSIGNFLAG 0x00000080 -#define SIGNEDFLAG 0x00000100 -#define LEFTFORMATFLAG 0x00000200 -#define LEADZEROFLAG 0x00000400 +#define LONGFLAG 0x00000001 +#define LONGLONGFLAG 0x00000002 +#define HALFFLAG 0x00000004 +#define HALFHALFFLAG 0x00000008 +#define SIZETFLAG 0x00000010 +#define INTMAXFLAG 0x00000020 +#define PTRDIFFFLAG 0x00000040 +#define ALTFLAG 0x00000080 +#define CAPSFLAG 0x00000100 +#define SHOWSIGNFLAG 0x00000200 +#define SIGNEDFLAG 0x00000400 +#define LEFTFORMATFLAG 0x00000800 +#define LEADZEROFLAG 0x00001000 +#define BLANKPOSFLAG 0x00002000 static char *longlong_to_string(char *buf, unsigned long long n, int len, uint flag) { @@ -118,6 +121,8 @@ static char *longlong_to_string(char *buf, unsigned long long n, int len, uint f buf[--pos] = '-'; else if ((flag & SHOWSIGNFLAG)) buf[--pos] = '+'; + else if ((flag & BLANKPOSFLAG)) + buf[--pos] = ' '; return &buf[pos]; } @@ -244,6 +249,9 @@ next_format: case '+': flags |= SHOWSIGNFLAG; goto next_format; + case ' ': + flags |= BLANKPOSFLAG; + goto next_format; case '#': flags |= ALTFLAG; goto next_format; @@ -260,9 +268,12 @@ next_format: case 'z': flags |= SIZETFLAG; goto next_format; - case 'D': - flags |= LONGFLAG; - /* fallthrough */ + case 'j': + flags |= INTMAXFLAG; + goto next_format; + case 't': + flags |= PTRDIFFFLAG; + goto next_format; case 'i': case 'd': n = (flags & LONGLONGFLAG) ? va_arg(ap, long long) : @@ -270,19 +281,20 @@ next_format: (flags & HALFHALFFLAG) ? (signed char)va_arg(ap, int) : (flags & HALFFLAG) ? (short)va_arg(ap, int) : (flags & SIZETFLAG) ? va_arg(ap, ssize_t) : + (flags & INTMAXFLAG) ? va_arg(ap, intmax_t) : + (flags & PTRDIFFFLAG) ? va_arg(ap, ptrdiff_t) : va_arg(ap, int); flags |= SIGNEDFLAG; s = longlong_to_string(num_buffer, n, sizeof(num_buffer), flags); goto _output_string; - case 'U': - flags |= LONGFLAG; - /* fallthrough */ case 'u': n = (flags & LONGLONGFLAG) ? va_arg(ap, unsigned long long) : (flags & LONGFLAG) ? va_arg(ap, unsigned long) : (flags & HALFHALFFLAG) ? (unsigned char)va_arg(ap, unsigned int) : (flags & HALFFLAG) ? (unsigned short)va_arg(ap, unsigned int) : (flags & SIZETFLAG) ? va_arg(ap, size_t) : + (flags & INTMAXFLAG) ? va_arg(ap, uintmax_t) : + (flags & PTRDIFFFLAG) ? (uintptr_t)va_arg(ap, ptrdiff_t) : va_arg(ap, unsigned int); s = longlong_to_string(num_buffer, n, sizeof(num_buffer), flags); goto _output_string; @@ -299,6 +311,8 @@ hex: (flags & HALFHALFFLAG) ? (unsigned char)va_arg(ap, unsigned int) : (flags & HALFFLAG) ? (unsigned short)va_arg(ap, unsigned int) : (flags & SIZETFLAG) ? va_arg(ap, size_t) : + (flags & INTMAXFLAG) ? va_arg(ap, uintmax_t) : + (flags & PTRDIFFFLAG) ? (uintptr_t)va_arg(ap, ptrdiff_t) : va_arg(ap, unsigned int); s = longlong_to_hexstring(num_buffer, n, sizeof(num_buffer), flags); if (flags & ALTFLAG) {