lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | /* Based on code by Larry McVoy <lm@neteng.engr.sgi.com>. */ |
| 2 | #include <printf.h> |
| 3 | #include <stdio.h> |
| 4 | #include <string.h> |
| 5 | #include <libc-internal.h> |
| 6 | |
| 7 | #define V 12345678.12345678 |
| 8 | |
| 9 | |
| 10 | int |
| 11 | main (int argc, char *argv[]) |
| 12 | { |
| 13 | char buf[1024]; |
| 14 | int result = 0; |
| 15 | |
| 16 | /* Testing printf_size_info requires using the deprecated |
| 17 | register_printf_function, resulting in warnings |
| 18 | "'register_printf_function' is deprecated". */ |
| 19 | DIAG_PUSH_NEEDS_COMMENT; |
| 20 | DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations"); |
| 21 | /* Register the printf handlers. */ |
| 22 | register_printf_function ('b', printf_size, printf_size_info); |
| 23 | register_printf_function ('B', printf_size, printf_size_info); |
| 24 | DIAG_POP_NEEDS_COMMENT; |
| 25 | |
| 26 | /* All of the formats here use the nonstandard extension specifier |
| 27 | just registered, so compiler checking will never grok them. */ |
| 28 | DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); |
| 29 | DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args"); |
| 30 | |
| 31 | sprintf (buf, "%g %b %B %.0b %.0B %.1b %.1B %8.0b %08.0B", |
| 32 | V, 1025., V, V, V, V, V, V, V, V); |
| 33 | fputs (buf, stdout); |
| 34 | if (strcmp (buf, "\ |
| 35 | 1.23457e+07 1.001k 12.346M 12m 12M 11.8m 12.3M 12m 0000012M")) |
| 36 | { |
| 37 | result = 1; |
| 38 | fputs (" -> WRONG\n", stdout); |
| 39 | } |
| 40 | else |
| 41 | fputs (" -> OK\n", stdout); |
| 42 | |
| 43 | sprintf (buf, "%b|%B|%-20.2b|%-10.0b|%-10.8b|%-10.2B|", |
| 44 | V, V, V, V, V, V, V, V, V, V, V); |
| 45 | fputs (buf, stdout); |
| 46 | if (strcmp (buf, "\ |
| 47 | 11.774m|12.346M|11.77m |12m |11.77375614m|12.35M |")) |
| 48 | { |
| 49 | result = 1; |
| 50 | fputs (" -> WRONG\n", stdout); |
| 51 | } |
| 52 | else |
| 53 | fputs (" -> OK\n", stdout); |
| 54 | |
| 55 | sprintf (buf, "%#.0B %*.0b %10.*b %*.*B %10.2B", |
| 56 | V, 2, V, 2, V, 10, 2, V, V); |
| 57 | fputs (buf, stdout); |
| 58 | if (strcmp (buf, "12.M 12m 11.77m 12.35M 12.35M")) |
| 59 | { |
| 60 | result = 1; |
| 61 | fputs (" -> WRONG\n", stdout); |
| 62 | } |
| 63 | else |
| 64 | fputs (" -> OK\n", stdout); |
| 65 | |
| 66 | sprintf (buf, "%6B %6.1B %b %B %b %B", |
| 67 | V, V, 1000.0, 1000.0, 1024.0, 1024.0); |
| 68 | fputs (buf, stdout); |
| 69 | if (strcmp (buf, "12.346M 12.3M 1000.000 1.000K 1.000k 1.024K")) |
| 70 | { |
| 71 | result = 1; |
| 72 | fputs (" -> WRONG\n", stdout); |
| 73 | } |
| 74 | else |
| 75 | fputs (" -> OK\n", stdout); |
| 76 | |
| 77 | return result; |
| 78 | } |