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-diag.h> |
6 | |
7 | #define V 12345678.12345678 |
8 | |
9 | |
10 | static int |
11 | do_test (void) |
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 (spec: 'b', func: printf_size, arginfo: printf_size_info); |
23 | register_printf_function (spec: 'B', func: printf_size, arginfo: 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 | } |
79 | |
80 | #define TEST_FUNCTION do_test () |
81 | #include "../test-skeleton.c" |
82 | |