1 /* Test %f format specifier */
2 #include <assert.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include "pub_core_basics.h"
8 #include "pub_core_libcbase.h"
9 #include "pub_core_libcassert.h"
10 #include "pub_core_libcprint.h"
11
12 #undef vg_assert
13 #define vg_assert(e) assert(e)
14 #undef vg_assert2
15 #define vg_assert2(e, fmt, args...) assert(e)
16
17 #include "coregrind/m_debuglog.c"
18
run(const char * format,...)19 void run(const char *format, ...)
20 {
21 int n, num_stars;
22 const char *p;
23 printf_buf buf;
24 va_list vargs;
25
26 // Count number of '*' in format
27 num_stars = 0;
28 for (p = format; *p; ++p)
29 if (*p == '*') ++num_stars;
30
31 va_start(vargs, format);
32 fprintf(stderr, "%s\tprintf = ", format);
33 n = vfprintf(stderr, format, vargs);
34 fprintf(stderr, "\twrote %3d chars\n", n);
35 va_end(vargs);
36
37 buf.n = 0;
38 buf.buf[0] = 0;
39
40 fprintf(stderr, "%s\tdebuglog = ", format);
41 va_start(vargs, format);
42 n = VG_(debugLog_vprintf)(add_to_buf, &buf, format, vargs);
43 va_end(vargs);
44
45 emit(buf.buf, strlen(buf.buf));
46 fprintf(stderr, "\twrote %3d chars\n", n);
47 }
48
main(int argc,char * argv[])49 int main(int argc, char *argv[])
50 {
51 double value;
52
53 fprintf(stderr, "...testing value 0\n");
54 value = 0.0;
55 run("|%f|", value);
56 run("|%2f|", value);
57 run("|%9f|", value);
58 run("|%8.0f|", value);
59 run("|%8.1f|", value);
60 run("|%8.2f|", value);
61
62 fprintf(stderr, "\n");
63 fprintf(stderr, "...testing value 3.7 (with rounding)\n");
64 value = 3.7;
65 run("|%f|", value);
66 run("|%4f|", value);
67 run("|%9f|", value);
68 run("|%4.0f|", value);
69 run("|%4.1f|", value);
70 run("|%4.2f|", value);
71
72 fprintf(stderr, "\n");
73 fprintf(stderr, "...testing value 123.01\n");
74 value = 123.01;
75 run("|%f|", value);
76 run("|%4f|", value);
77 run("|%9f|", value);
78 run("|%8.0f|", value);
79 run("|%8.1f|", value);
80 run("|%8.2f|", value);
81 run("|%8.3f|", value);
82
83 fprintf(stderr, "\n");
84 fprintf(stderr, "...testing value 3.0019 (with rounding)\n");
85 value = 3.0019;
86 run("|%f|", value);
87 run("|%10f|", value);
88 run("|%10.0f|", value);
89 run("|%10.3f|", value);
90 run("|%10.4f|", value);
91 run("|%.4f|", value);
92 run("|%.9f|", value);
93
94 fprintf(stderr, "\n");
95 fprintf(stderr, "...testing value -123.456 (with rounding)\n");
96 value = -123.456;
97 run("|%f|", value);
98 run("|%10f|", value);
99 run("|%10.0f|", value);
100 run("|%10.1f|", value);
101 run("|%10.2f|", value);
102 run("|%10.3f|", value);
103 run("|%10.4f|", value);
104 run("|%10.5f|", value);
105 run("|%.4f|", value);
106
107 fprintf(stderr, "\n");
108 fprintf(stderr, "...testing value = -123.456 width = '*'\n");
109 value = -123.456;
110 run("|%*f|", 10, value);
111 run("|%*f|", 2, value);
112 run("|%*f.1|", 10, value);
113
114 fprintf(stderr, "\n");
115 fprintf(stderr, "...testing precision = '*'\n");
116 value = -123.456;
117 run("|%.*f|", 10, value);
118 run("|%.*f|", 2, value);
119 run("|%10.*f|", 2, value);
120
121 fprintf(stderr, "\n");
122 fprintf(stderr, "...testing width/precision = '*'\n");
123 value = -123.456;
124 run("|%*.*f|", 20, 5, value);
125 run("|%*.*f|", 1, 4, value);
126
127 fprintf(stderr, "\n");
128 fprintf(stderr, "...testing left justification\n");
129 value = 3.1415;
130 run("|%10f|", value);
131 run("|%-10f|", value);
132
133 fprintf(stderr, "\n");
134 fprintf(stderr, "...testing strings\n");
135 const char *str = "abcd";
136 run("|%s|", str);
137 run("|%9s|", str);
138 run("|%-9s|", str);
139 run("|%*s|", 6, str);
140
141 fprintf(stderr, "\n");
142 fprintf(stderr, "...testing integers\n");
143 long long ival = -1004005;
144 run("|%lld|", ival);
145 // runint("|%'lld|", ival); // locale specific (LC_NUMERIC)
146 run("|%15lld|", ival);
147 run("|%-15lld|", ival);
148 // runint("|%'-15lld|", ival); // locale specific (LC_NUMERIC)
149 run("|%100lld|", ival);
150 run("|%*lld|", 13, ival);
151
152 value = 0.99685224;
153 run("|%3.0f|", value);
154 run("|%3.1f|", value);
155 run("|%3.2f|", value);
156 run("|%3.3f|", value);
157 run("|%3.4f|", value);
158 run("|%3.5f|", value);
159
160 return 0;
161 }
162