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
10static int
11do_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, "\
351.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, "\
4711.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

source code of glibc/stdio-common/tst-printfsz.c