xref: /aosp_15_r20/external/llvm-libc/test/src/stdio/sscanf_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for sscanf ----------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/stdio/sscanf.h"
10*71db0c75SAndroid Build Coastguard Worker 
11*71db0c75SAndroid Build Coastguard Worker #include "hdr/stdio_macros.h" // For EOF
12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/limits.h"
13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h"
15*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
16*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,SimpleStringConv)17*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, SimpleStringConv) {
18*71db0c75SAndroid Build Coastguard Worker   int ret_val;
19*71db0c75SAndroid Build Coastguard Worker   char buffer[10];
20*71db0c75SAndroid Build Coastguard Worker   char buffer2[10];
21*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("abc123", "abc %s", buffer);
22*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(ret_val, 1);
23*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "123");
24*71db0c75SAndroid Build Coastguard Worker 
25*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("abc123", "%3s %3s", buffer, buffer2);
26*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(ret_val, 2);
27*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "abc");
28*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer2, "123");
29*71db0c75SAndroid Build Coastguard Worker 
30*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("abc 123", "%3s%3s", buffer, buffer2);
31*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(ret_val, 2);
32*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "abc");
33*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer2, "123");
34*71db0c75SAndroid Build Coastguard Worker }
35*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,IntConvSimple)36*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, IntConvSimple) {
37*71db0c75SAndroid Build Coastguard Worker   int ret_val;
38*71db0c75SAndroid Build Coastguard Worker   int result = 0;
39*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%d", &result);
40*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
41*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 123);
42*71db0c75SAndroid Build Coastguard Worker 
43*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456", "%i", &result);
44*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
45*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 456);
46*71db0c75SAndroid Build Coastguard Worker 
47*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("789", "%x", &result);
48*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
49*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0x789);
50*71db0c75SAndroid Build Coastguard Worker 
51*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("012", "%o", &result);
52*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
53*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 012);
54*71db0c75SAndroid Build Coastguard Worker 
55*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("345", "%u", &result);
56*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
57*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 345);
58*71db0c75SAndroid Build Coastguard Worker 
59*71db0c75SAndroid Build Coastguard Worker   // 288 characters
60*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("10000000000000000000000000000000"
61*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
62*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
63*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
64*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
65*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
66*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
67*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
68*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000",
69*71db0c75SAndroid Build Coastguard Worker                                    "%d", &result);
70*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
71*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, int(LIBC_NAMESPACE::cpp::numeric_limits<intmax_t>::max()));
72*71db0c75SAndroid Build Coastguard Worker 
73*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("Not an integer", "%d", &result);
74*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
75*71db0c75SAndroid Build Coastguard Worker }
76*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,IntConvLengthModifier)77*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, IntConvLengthModifier) {
78*71db0c75SAndroid Build Coastguard Worker   int ret_val;
79*71db0c75SAndroid Build Coastguard Worker   uintmax_t max_result = 0;
80*71db0c75SAndroid Build Coastguard Worker   int int_result = 0;
81*71db0c75SAndroid Build Coastguard Worker   char char_result = 0;
82*71db0c75SAndroid Build Coastguard Worker 
83*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%ju", &max_result);
84*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
85*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(max_result, uintmax_t(123));
86*71db0c75SAndroid Build Coastguard Worker 
87*71db0c75SAndroid Build Coastguard Worker   // Check overflow handling
88*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("999999999999999999999999999999999999",
89*71db0c75SAndroid Build Coastguard Worker                                    "%ju", &max_result);
90*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
91*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(max_result, LIBC_NAMESPACE::cpp::numeric_limits<uintmax_t>::max());
92*71db0c75SAndroid Build Coastguard Worker 
93*71db0c75SAndroid Build Coastguard Worker   // Because this is unsigned, any out of range value should return the maximum,
94*71db0c75SAndroid Build Coastguard Worker   // even with a negative sign.
95*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-999999999999999999999999999999999999",
96*71db0c75SAndroid Build Coastguard Worker                                    "%ju", &max_result);
97*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
98*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(max_result, LIBC_NAMESPACE::cpp::numeric_limits<uintmax_t>::max());
99*71db0c75SAndroid Build Coastguard Worker 
100*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-18446744073709551616", "%ju", &max_result);
101*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
102*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(max_result, LIBC_NAMESPACE::cpp::numeric_limits<uintmax_t>::max());
103*71db0c75SAndroid Build Coastguard Worker 
104*71db0c75SAndroid Build Coastguard Worker   // But any number below the maximum should have the - sign applied.
105*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-1", "%ju", &max_result);
106*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
107*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(max_result, uintmax_t(-1));
108*71db0c75SAndroid Build Coastguard Worker 
109*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-1", "%u", &int_result);
110*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
111*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(int_result, -1);
112*71db0c75SAndroid Build Coastguard Worker 
113*71db0c75SAndroid Build Coastguard Worker   max_result = 0xff00ff00ff00ff00;
114*71db0c75SAndroid Build Coastguard Worker   char_result = 0x6f;
115*71db0c75SAndroid Build Coastguard Worker 
116*71db0c75SAndroid Build Coastguard Worker   // Overflows for sizes larger than the maximum are handled by casting.
117*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("8589967360", "%d", &int_result);
118*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
119*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(int_result, int(8589967360)); // 2^33 + 2^15
120*71db0c75SAndroid Build Coastguard Worker 
121*71db0c75SAndroid Build Coastguard Worker   // Check that the adjacent values weren't touched by the overflow.
122*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(max_result, uintmax_t(0xff00ff00ff00ff00));
123*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(char_result, char(0x6f));
124*71db0c75SAndroid Build Coastguard Worker 
125*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-8589967360", "%d", &int_result);
126*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
127*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(int_result, int(-8589967360));
128*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(max_result, uintmax_t(0xff00ff00ff00ff00));
129*71db0c75SAndroid Build Coastguard Worker   ASSERT_EQ(char_result, char(0x6f));
130*71db0c75SAndroid Build Coastguard Worker 
131*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("25", "%hhd", &char_result);
132*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
133*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(char_result, char(25));
134*71db0c75SAndroid Build Coastguard Worker }
135*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,IntConvBaseSelection)136*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, IntConvBaseSelection) {
137*71db0c75SAndroid Build Coastguard Worker   int ret_val;
138*71db0c75SAndroid Build Coastguard Worker   int result = 0;
139*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0xabc123", "%i", &result);
140*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
141*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0xabc123);
142*71db0c75SAndroid Build Coastguard Worker 
143*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0456", "%i", &result);
144*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
145*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0456);
146*71db0c75SAndroid Build Coastguard Worker 
147*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0999", "%i", &result);
148*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
149*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
150*71db0c75SAndroid Build Coastguard Worker 
151*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123abc456", "%i", &result);
152*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
153*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 123);
154*71db0c75SAndroid Build Coastguard Worker }
155*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,IntConvMaxLengthTests)156*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, IntConvMaxLengthTests) {
157*71db0c75SAndroid Build Coastguard Worker   int ret_val;
158*71db0c75SAndroid Build Coastguard Worker   int result = 0;
159*71db0c75SAndroid Build Coastguard Worker 
160*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("12", "%1d", &result);
161*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
162*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 1);
163*71db0c75SAndroid Build Coastguard Worker 
164*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-1", "%1d", &result);
165*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
166*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
167*71db0c75SAndroid Build Coastguard Worker 
168*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("+1", "%1d", &result);
169*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
170*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
171*71db0c75SAndroid Build Coastguard Worker 
172*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("01", "%1d", &result);
173*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
174*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
175*71db0c75SAndroid Build Coastguard Worker 
176*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("01", "%1i", &result);
177*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
178*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
179*71db0c75SAndroid Build Coastguard Worker 
180*71db0c75SAndroid Build Coastguard Worker   result = -999;
181*71db0c75SAndroid Build Coastguard Worker 
182*71db0c75SAndroid Build Coastguard Worker   // 0x is a valid prefix, but not a valid number. This should be a matching
183*71db0c75SAndroid Build Coastguard Worker   // failure and should not modify the values.
184*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x1", "%2i", &result);
185*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
186*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -999);
187*71db0c75SAndroid Build Coastguard Worker 
188*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-0x1", "%3i", &result);
189*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
190*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -999);
191*71db0c75SAndroid Build Coastguard Worker 
192*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x1", "%3i", &result);
193*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
194*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 1);
195*71db0c75SAndroid Build Coastguard Worker 
196*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-0x1", "%4i", &result);
197*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
198*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -1);
199*71db0c75SAndroid Build Coastguard Worker 
200*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-0x123", "%4i", &result);
201*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
202*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -1);
203*71db0c75SAndroid Build Coastguard Worker 
204*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123456789", "%5i", &result);
205*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
206*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 12345);
207*71db0c75SAndroid Build Coastguard Worker 
208*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123456789", "%10i", &result);
209*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
210*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 123456789);
211*71db0c75SAndroid Build Coastguard Worker }
212*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,IntConvNoWriteTests)213*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, IntConvNoWriteTests) {
214*71db0c75SAndroid Build Coastguard Worker   int ret_val;
215*71db0c75SAndroid Build Coastguard Worker   // Result shouldn't be used by these tests, but it's safer to have it and
216*71db0c75SAndroid Build Coastguard Worker   // check it.
217*71db0c75SAndroid Build Coastguard Worker   int result = 0;
218*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-1", "%*1d", &result);
219*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
220*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
221*71db0c75SAndroid Build Coastguard Worker 
222*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("01", "%*1i", &result);
223*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
224*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
225*71db0c75SAndroid Build Coastguard Worker 
226*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x1", "%*2i", &result);
227*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
228*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
229*71db0c75SAndroid Build Coastguard Worker 
230*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("a", "%*i", &result);
231*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
232*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
233*71db0c75SAndroid Build Coastguard Worker 
234*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%*i", &result);
235*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
236*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
237*71db0c75SAndroid Build Coastguard Worker }
238*71db0c75SAndroid Build Coastguard Worker 
239*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_COPT_SCANF_DISABLE_FLOAT
TEST(LlvmLibcSScanfTest,FloatConvSimple)240*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvSimple) {
241*71db0c75SAndroid Build Coastguard Worker   int ret_val;
242*71db0c75SAndroid Build Coastguard Worker   float result = 0;
243*71db0c75SAndroid Build Coastguard Worker 
244*71db0c75SAndroid Build Coastguard Worker   float inf = LIBC_NAMESPACE::fputil::FPBits<float>::inf().get_val();
245*71db0c75SAndroid Build Coastguard Worker   float nan = LIBC_NAMESPACE::fputil::FPBits<float>::quiet_nan().get_val();
246*71db0c75SAndroid Build Coastguard Worker 
247*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%f", &result);
248*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
249*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 123.0);
250*71db0c75SAndroid Build Coastguard Worker 
251*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456.1", "%a", &result);
252*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
253*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 456.1);
254*71db0c75SAndroid Build Coastguard Worker 
255*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x789.ap0", "%e", &result);
256*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
257*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0x789.ap0);
258*71db0c75SAndroid Build Coastguard Worker 
259*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x.8", "%e", &result);
260*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
261*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0x0.8p0);
262*71db0c75SAndroid Build Coastguard Worker 
263*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x8.", "%e", &result);
264*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
265*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0x8.0p0);
266*71db0c75SAndroid Build Coastguard Worker 
267*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("+12.0e1", "%g", &result);
268*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
269*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 12.0e1);
270*71db0c75SAndroid Build Coastguard Worker 
271*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("inf", "%F", &result);
272*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
273*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, inf);
274*71db0c75SAndroid Build Coastguard Worker 
275*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("NaN", "%A", &result);
276*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
277*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, nan);
278*71db0c75SAndroid Build Coastguard Worker 
279*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-InFiNiTy", "%E", &result);
280*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
281*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, -inf);
282*71db0c75SAndroid Build Coastguard Worker 
283*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1e10", "%G", &result);
284*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
285*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 1e10);
286*71db0c75SAndroid Build Coastguard Worker 
287*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf(".1", "%G", &result);
288*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
289*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.1);
290*71db0c75SAndroid Build Coastguard Worker 
291*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1.", "%G", &result);
292*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
293*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 1.0);
294*71db0c75SAndroid Build Coastguard Worker 
295*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0", "%f", &result);
296*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
297*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
298*71db0c75SAndroid Build Coastguard Worker 
299*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("Not a float", "%f", &result);
300*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
301*71db0c75SAndroid Build Coastguard Worker }
302*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,FloatConvLengthModifier)303*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvLengthModifier) {
304*71db0c75SAndroid Build Coastguard Worker   int ret_val;
305*71db0c75SAndroid Build Coastguard Worker   double d_result = 0;
306*71db0c75SAndroid Build Coastguard Worker   long double ld_result = 0;
307*71db0c75SAndroid Build Coastguard Worker 
308*71db0c75SAndroid Build Coastguard Worker   double d_inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
309*71db0c75SAndroid Build Coastguard Worker   long double ld_nan =
310*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val();
311*71db0c75SAndroid Build Coastguard Worker 
312*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%lf", &d_result);
313*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
314*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(d_result, 123.0);
315*71db0c75SAndroid Build Coastguard Worker 
316*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456.1", "%La", &ld_result);
317*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
318*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(ld_result, 456.1L);
319*71db0c75SAndroid Build Coastguard Worker 
320*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("inf", "%le", &d_result);
321*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
322*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(d_result, d_inf);
323*71db0c75SAndroid Build Coastguard Worker 
324*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("nan", "%Lg", &ld_result);
325*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
326*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(ld_result, ld_nan);
327*71db0c75SAndroid Build Coastguard Worker 
328*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1e-300", "%lF", &d_result);
329*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
330*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(d_result, 1e-300);
331*71db0c75SAndroid Build Coastguard Worker 
332*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1.0e600", "%LA", &ld_result);
333*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
334*71db0c75SAndroid Build Coastguard Worker // 1e600 may be larger than the maximum long double (if long double is double).
335*71db0c75SAndroid Build Coastguard Worker // In that case both of these should be evaluated as inf.
336*71db0c75SAndroid Build Coastguard Worker #ifdef LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64
337*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(ld_result, d_inf);
338*71db0c75SAndroid Build Coastguard Worker #else
339*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(ld_result, 1.0e600L);
340*71db0c75SAndroid Build Coastguard Worker #endif
341*71db0c75SAndroid Build Coastguard Worker }
342*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,FloatConvLongNumber)343*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvLongNumber) {
344*71db0c75SAndroid Build Coastguard Worker   int ret_val;
345*71db0c75SAndroid Build Coastguard Worker   float result = 0;
346*71db0c75SAndroid Build Coastguard Worker   double d_result = 0;
347*71db0c75SAndroid Build Coastguard Worker 
348*71db0c75SAndroid Build Coastguard Worker   // 32 characters
349*71db0c75SAndroid Build Coastguard Worker   ret_val =
350*71db0c75SAndroid Build Coastguard Worker       LIBC_NAMESPACE::sscanf("123456789012345678901234567890.0", "%f", &result);
351*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
352*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 123456789012345678901234567890.0f);
353*71db0c75SAndroid Build Coastguard Worker 
354*71db0c75SAndroid Build Coastguard Worker   // 64 characters
355*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf(
356*71db0c75SAndroid Build Coastguard Worker       "123456789012345678901234567890123456789012345678901234567890.000", "%la",
357*71db0c75SAndroid Build Coastguard Worker       &d_result);
358*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
359*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(
360*71db0c75SAndroid Build Coastguard Worker       d_result,
361*71db0c75SAndroid Build Coastguard Worker       123456789012345678901234567890123456789012345678901234567890.000);
362*71db0c75SAndroid Build Coastguard Worker 
363*71db0c75SAndroid Build Coastguard Worker   // 128 characters
364*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf(
365*71db0c75SAndroid Build Coastguard Worker       "123456789012345678901234567890123456789012345678901234567890"
366*71db0c75SAndroid Build Coastguard Worker       "123456789012345678901234567890123456789012345678901234567890.0000000",
367*71db0c75SAndroid Build Coastguard Worker       "%le", &d_result);
368*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
369*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(
370*71db0c75SAndroid Build Coastguard Worker       d_result,
371*71db0c75SAndroid Build Coastguard Worker       123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.0000000);
372*71db0c75SAndroid Build Coastguard Worker 
373*71db0c75SAndroid Build Coastguard Worker   // 256 characters
374*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("10000000000000000000000000000000"
375*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
376*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
377*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
378*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
379*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
380*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
381*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000",
382*71db0c75SAndroid Build Coastguard Worker                                    "%lf", &d_result);
383*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
384*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(d_result, 1e255);
385*71db0c75SAndroid Build Coastguard Worker 
386*71db0c75SAndroid Build Coastguard Worker   // 288 characters
387*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("10000000000000000000000000000000"
388*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
389*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
390*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
391*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
392*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
393*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
394*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
395*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000",
396*71db0c75SAndroid Build Coastguard Worker                                    "%lf", &d_result);
397*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
398*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(d_result, 1e287);
399*71db0c75SAndroid Build Coastguard Worker }
400*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,FloatConvComplexParsing)401*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvComplexParsing) {
402*71db0c75SAndroid Build Coastguard Worker   int ret_val;
403*71db0c75SAndroid Build Coastguard Worker   float result = 0;
404*71db0c75SAndroid Build Coastguard Worker 
405*71db0c75SAndroid Build Coastguard Worker   float inf = LIBC_NAMESPACE::fputil::FPBits<float>::inf().get_val();
406*71db0c75SAndroid Build Coastguard Worker   float nan = LIBC_NAMESPACE::fputil::FPBits<float>::quiet_nan().get_val();
407*71db0c75SAndroid Build Coastguard Worker 
408*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x1.0e3", "%f", &result);
409*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
410*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0x1.0e3p0);
411*71db0c75SAndroid Build Coastguard Worker 
412*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("", "%a", &result);
413*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
414*71db0c75SAndroid Build Coastguard Worker 
415*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("+", "%a", &result);
416*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
417*71db0c75SAndroid Build Coastguard Worker 
418*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-", "%a", &result);
419*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
420*71db0c75SAndroid Build Coastguard Worker 
421*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("+.", "%a", &result);
422*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
423*71db0c75SAndroid Build Coastguard Worker 
424*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-.e+10", "%a", &result);
425*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
426*71db0c75SAndroid Build Coastguard Worker 
427*71db0c75SAndroid Build Coastguard Worker   // This is a specific example from the standard. Its behavior diverges from
428*71db0c75SAndroid Build Coastguard Worker   // other implementations that accept "100e" as being the same as "100e0"
429*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("100er", "%a", &result);
430*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
431*71db0c75SAndroid Build Coastguard Worker 
432*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("nah", "%a", &result);
433*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
434*71db0c75SAndroid Build Coastguard Worker 
435*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("indirection", "%a", &result);
436*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
437*71db0c75SAndroid Build Coastguard Worker 
438*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("infnan", "%a", &result);
439*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
440*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, inf);
441*71db0c75SAndroid Build Coastguard Worker 
442*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("naninf", "%a", &result);
443*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
444*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, nan);
445*71db0c75SAndroid Build Coastguard Worker 
446*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("infinityinfinity", "%a", &result);
447*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
448*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, inf);
449*71db0c75SAndroid Build Coastguard Worker 
450*71db0c75SAndroid Build Coastguard Worker   // For %f to accept a string as representing it has to be either "inf" or
451*71db0c75SAndroid Build Coastguard Worker   // "infinity" when it stops. It only stops when it encounters a character that
452*71db0c75SAndroid Build Coastguard Worker   // isn't the next one in the string, so it accepts "infi" as the the longest
453*71db0c75SAndroid Build Coastguard Worker   // prefix of a possibly valid floating-point number, but determines that it is
454*71db0c75SAndroid Build Coastguard Worker   // not valid and returns a matching failure. This is because it can only unget
455*71db0c75SAndroid Build Coastguard Worker   // one character so when it finds that the character after the second 'i' is
456*71db0c75SAndroid Build Coastguard Worker   // not the next character in "infinity" it can't rewind to the point where it
457*71db0c75SAndroid Build Coastguard Worker   // had just "inf".
458*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("infi", "%a", &result);
459*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
460*71db0c75SAndroid Build Coastguard Worker 
461*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("infinite", "%a", &result);
462*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
463*71db0c75SAndroid Build Coastguard Worker 
464*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-.1e1", "%f", &result);
465*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
466*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, -.1e1);
467*71db0c75SAndroid Build Coastguard Worker 
468*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1.2.e1", "%f", &result);
469*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
470*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 1.2);
471*71db0c75SAndroid Build Coastguard Worker }
472*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,FloatConvMaxWidth)473*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvMaxWidth) {
474*71db0c75SAndroid Build Coastguard Worker   int ret_val;
475*71db0c75SAndroid Build Coastguard Worker   float result = 0;
476*71db0c75SAndroid Build Coastguard Worker 
477*71db0c75SAndroid Build Coastguard Worker   float inf = LIBC_NAMESPACE::fputil::FPBits<float>::inf().get_val();
478*71db0c75SAndroid Build Coastguard Worker 
479*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%3f", &result);
480*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
481*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 123.0);
482*71db0c75SAndroid Build Coastguard Worker 
483*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%5f", &result);
484*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
485*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 123.0);
486*71db0c75SAndroid Build Coastguard Worker 
487*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456", "%1f", &result);
488*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
489*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 4.0);
490*71db0c75SAndroid Build Coastguard Worker 
491*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-789", "%1f", &result);
492*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
493*71db0c75SAndroid Build Coastguard Worker 
494*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-123", "%2f", &result);
495*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
496*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, -1.0);
497*71db0c75SAndroid Build Coastguard Worker 
498*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("inf", "%2f", &result);
499*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
500*71db0c75SAndroid Build Coastguard Worker 
501*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("nan", "%1f", &result);
502*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
503*71db0c75SAndroid Build Coastguard Worker 
504*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-inf", "%3f", &result);
505*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
506*71db0c75SAndroid Build Coastguard Worker 
507*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-nan", "%3f", &result);
508*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
509*71db0c75SAndroid Build Coastguard Worker 
510*71db0c75SAndroid Build Coastguard Worker   // If the max length were not here this would fail as discussed above, but
511*71db0c75SAndroid Build Coastguard Worker   // since the max length limits it to the 3 it succeeds.
512*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("infinite", "%3f", &result);
513*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
514*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, inf);
515*71db0c75SAndroid Build Coastguard Worker 
516*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-infinite", "%4f", &result);
517*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
518*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, -inf);
519*71db0c75SAndroid Build Coastguard Worker 
520*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("01", "%1f", &result);
521*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
522*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
523*71db0c75SAndroid Build Coastguard Worker 
524*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x1", "%2f", &result);
525*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
526*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
527*71db0c75SAndroid Build Coastguard Worker 
528*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("100e", "%4f", &result);
529*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
530*71db0c75SAndroid Build Coastguard Worker 
531*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("100e+10", "%5f", &result);
532*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
533*71db0c75SAndroid Build Coastguard Worker 
534*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("100e10", "%5f", &result);
535*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
536*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 100e1);
537*71db0c75SAndroid Build Coastguard Worker }
538*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,FloatConvNoWrite)539*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, FloatConvNoWrite) {
540*71db0c75SAndroid Build Coastguard Worker   int ret_val;
541*71db0c75SAndroid Build Coastguard Worker   float result = 0;
542*71db0c75SAndroid Build Coastguard Worker 
543*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%*f", &result);
544*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
545*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
546*71db0c75SAndroid Build Coastguard Worker 
547*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456.1", "%*a", &result);
548*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
549*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
550*71db0c75SAndroid Build Coastguard Worker 
551*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0x789.ap0", "%*e", &result);
552*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
553*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
554*71db0c75SAndroid Build Coastguard Worker 
555*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("+12.0e1", "%*g", &result);
556*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
557*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
558*71db0c75SAndroid Build Coastguard Worker 
559*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("inf", "%*F", &result);
560*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
561*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
562*71db0c75SAndroid Build Coastguard Worker 
563*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("NaN", "%*A", &result);
564*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
565*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
566*71db0c75SAndroid Build Coastguard Worker 
567*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-InFiNiTy", "%*E", &result);
568*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
569*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
570*71db0c75SAndroid Build Coastguard Worker 
571*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1e10", "%*G", &result);
572*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
573*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
574*71db0c75SAndroid Build Coastguard Worker 
575*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf(".1", "%*G", &result);
576*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
577*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
578*71db0c75SAndroid Build Coastguard Worker 
579*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%*3f", &result);
580*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
581*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
582*71db0c75SAndroid Build Coastguard Worker 
583*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123", "%*5f", &result);
584*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
585*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
586*71db0c75SAndroid Build Coastguard Worker 
587*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("456", "%*1f", &result);
588*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
589*71db0c75SAndroid Build Coastguard Worker   EXPECT_FP_EQ(result, 0.0);
590*71db0c75SAndroid Build Coastguard Worker 
591*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("Not a float", "%*f", &result);
592*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
593*71db0c75SAndroid Build Coastguard Worker }
594*71db0c75SAndroid Build Coastguard Worker #endif
595*71db0c75SAndroid Build Coastguard Worker 
596*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_COPT_SCANF_DISABLE_INDEX_MODE
TEST(LlvmLibcSScanfTest,CurPosCombined)597*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, CurPosCombined) {
598*71db0c75SAndroid Build Coastguard Worker   int ret_val;
599*71db0c75SAndroid Build Coastguard Worker   int result = -1;
600*71db0c75SAndroid Build Coastguard Worker   char c_result = 0;
601*71db0c75SAndroid Build Coastguard Worker 
602*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("some text", "%n", &result);
603*71db0c75SAndroid Build Coastguard Worker   // %n doesn't count as a conversion for the return value.
604*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
605*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 0);
606*71db0c75SAndroid Build Coastguard Worker 
607*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1234567890", "12345%n", &result);
608*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
609*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 5);
610*71db0c75SAndroid Build Coastguard Worker 
611*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("1234567890", "12345%n", &result);
612*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
613*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 5);
614*71db0c75SAndroid Build Coastguard Worker 
615*71db0c75SAndroid Build Coastguard Worker   // 288 characters
616*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("10000000000000000000000000000000"
617*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
618*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
619*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
620*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
621*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
622*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
623*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
624*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000",
625*71db0c75SAndroid Build Coastguard Worker                                    "%*d%hhn", &c_result);
626*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
627*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(c_result, char(288)); // Overflow is handled by casting.
628*71db0c75SAndroid Build Coastguard Worker 
629*71db0c75SAndroid Build Coastguard Worker   // 320 characters
630*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("10000000000000000000000000000000"
631*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
632*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
633*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
634*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
635*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
636*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
637*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
638*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000"
639*71db0c75SAndroid Build Coastguard Worker                                    "00000000000000000000000000000000",
640*71db0c75SAndroid Build Coastguard Worker                                    "%*d%n", &result);
641*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
642*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 320);
643*71db0c75SAndroid Build Coastguard Worker }
644*71db0c75SAndroid Build Coastguard Worker #endif
645*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,PointerConvCombined)646*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, PointerConvCombined) {
647*71db0c75SAndroid Build Coastguard Worker   int ret_val;
648*71db0c75SAndroid Build Coastguard Worker   void *result;
649*71db0c75SAndroid Build Coastguard Worker 
650*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("(nullptr)", "%p", &result);
651*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
652*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, static_cast<void *>(nullptr));
653*71db0c75SAndroid Build Coastguard Worker 
654*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("(NuLlPtR)", "%p", &result);
655*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
656*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, static_cast<void *>(nullptr));
657*71db0c75SAndroid Build Coastguard Worker 
658*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("(NULLPTR)", "%p", &result);
659*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
660*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, static_cast<void *>(nullptr));
661*71db0c75SAndroid Build Coastguard Worker 
662*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("(null)", "%p", &result);
663*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
664*71db0c75SAndroid Build Coastguard Worker 
665*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("(nullptr2", "%p", &result);
666*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
667*71db0c75SAndroid Build Coastguard Worker 
668*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0", "%p", &result);
669*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
670*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, reinterpret_cast<void *>(0));
671*71db0c75SAndroid Build Coastguard Worker 
672*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("100", "%p", &result);
673*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
674*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, reinterpret_cast<void *>(0x100));
675*71db0c75SAndroid Build Coastguard Worker 
676*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("-1", "%p", &result);
677*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
678*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, reinterpret_cast<void *>(-1));
679*71db0c75SAndroid Build Coastguard Worker 
680*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0xabcDEFG", "%p", &result);
681*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 1);
682*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, reinterpret_cast<void *>(0xabcdef));
683*71db0c75SAndroid Build Coastguard Worker }
684*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSScanfTest,CombinedConv)685*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSScanfTest, CombinedConv) {
686*71db0c75SAndroid Build Coastguard Worker   int ret_val;
687*71db0c75SAndroid Build Coastguard Worker   int result = 0;
688*71db0c75SAndroid Build Coastguard Worker   char buffer[10];
689*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("123abc", "%i%s", &result, buffer);
690*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 2);
691*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, 123);
692*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "abc");
693*71db0c75SAndroid Build Coastguard Worker 
694*71db0c75SAndroid Build Coastguard Worker   result = -1;
695*71db0c75SAndroid Build Coastguard Worker 
696*71db0c75SAndroid Build Coastguard Worker   // 0x is a valid prefix, but not a valid number. This should be a matching
697*71db0c75SAndroid Build Coastguard Worker   // failure and should not modify the values.
698*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0xZZZ", "%i%s", &result, buffer);
699*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
700*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -1);
701*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "abc");
702*71db0c75SAndroid Build Coastguard Worker 
703*71db0c75SAndroid Build Coastguard Worker   ret_val = LIBC_NAMESPACE::sscanf("0xZZZ", "%X%s", &result, buffer);
704*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(ret_val, 0);
705*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(result, -1);
706*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buffer, "abc");
707*71db0c75SAndroid Build Coastguard Worker }
708