2 * Conformance tests for *printf functions.
4 * Copyright 2002 Uwe Bonnes
5 * Copyright 2004 Aneurin Price
6 * Copyright 2005 Mike McCormack
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 /* With Visual Studio >= 2005, swprintf() takes an extra parameter unless
24 * the following macro is defined.
26 #define _CRT_NON_CONFORMING_SWPRINTFS
30 #include "wine/test.h"
32 static void test_sprintf( void )
36 double pnumber
=789456123;
38 WCHAR wide
[] = { 'w','i','d','e',0};
41 r
= sprintf(buffer
,format
,pnumber
);
43 ok(!strcmp(buffer
,"+7.894561230000000e+008"),"exponent format incorrect\n");
45 ok( r
==23, "return count wrong\n");
48 r
= sprintf(buffer
,format
,((ULONGLONG
)0xffffffff)*0xffffffff);
49 ok(!strcmp(buffer
,"-8589934591"),"Problem with long long\n");
50 ok( r
==11, "return count wrong\n");
53 r
= sprintf(buffer
,format
,(LONGLONG
)100);
54 ok(!strcmp(buffer
," +100") && r
==8,"+8I64d failed: '%s'\n", buffer
);
57 r
= sprintf(buffer
,format
,(LONGLONG
)100);
58 ok(!strcmp(buffer
,"+00000100") && r
==9,"+.8I64d failed: '%s'\n", buffer
);
60 format
= "%+10.8I64d";
61 r
= sprintf(buffer
,format
,(LONGLONG
)100);
62 ok(!strcmp(buffer
," +00000100") && r
==10,"+10.8I64d failed: '%s'\n", buffer
);
64 r
= sprintf(buffer
,format
,(LONGLONG
)100);
65 ok(!strcmp(buffer
,"_1I64d") && r
==6,"_1I64d failed\n");
68 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
69 ok(!strcmp(buffer
,"-00100") && r
==6,"-1.5I64d failed: '%s'\n", buffer
);
72 r
= sprintf(buffer
,format
,(LONGLONG
)100);
73 ok(!strcmp(buffer
," 100") && r
==5,"5I64d failed: '%s'\n", buffer
);
76 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
77 ok(!strcmp(buffer
," -100") && r
==5,"5I64d failed: '%s'\n", buffer
);
80 r
= sprintf(buffer
,format
,(LONGLONG
)100);
81 ok(!strcmp(buffer
,"100 ") && r
==5,"-5I64d failed: '%s'\n", buffer
);
84 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
85 ok(!strcmp(buffer
,"-100 ") && r
==5,"-5I64d failed: '%s'\n", buffer
);
88 r
= sprintf(buffer
,format
,(LONGLONG
)100);
89 ok(!strcmp(buffer
,"00100") && r
==5,"-.5I64d failed: '%s'\n", buffer
);
92 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
93 ok(!strcmp(buffer
,"-00100") && r
==6,"-.5I64d failed: '%s'\n", buffer
);
96 r
= sprintf(buffer
,format
,(LONGLONG
)100);
97 ok(!strcmp(buffer
,"00100 ") && r
==8,"-8.5I64d failed: '%s'\n", buffer
);
100 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
101 ok(!strcmp(buffer
,"-00100 ") && r
==8,"-8.5I64d failed: '%s'\n", buffer
);
104 r
= sprintf(buffer
,format
,(LONGLONG
)100);
105 ok(!strcmp(buffer
,"00100") && r
==5,"05I64d failed: '%s'\n", buffer
);
108 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
109 ok(!strcmp(buffer
,"-0100") && r
==5,"05I64d failed: '%s'\n", buffer
);
112 r
= sprintf(buffer
,format
,(LONGLONG
)100);
113 ok(!strcmp(buffer
," 100") && r
==4,"' I64d' failed: '%s'\n", buffer
);
116 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
117 ok(!strcmp(buffer
,"-100") && r
==4,"' I64d' failed: '%s'\n", buffer
);
120 r
= sprintf(buffer
,format
,(LONGLONG
)100);
121 ok(!strcmp(buffer
," 100") && r
==5,"' 5I64d' failed: '%s'\n", buffer
);
124 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
125 ok(!strcmp(buffer
," -100") && r
==5,"' 5I64d' failed: '%s'\n", buffer
);
128 r
= sprintf(buffer
,format
,(LONGLONG
)100);
129 ok(!strcmp(buffer
," 00100") && r
==6,"' .5I64d' failed: '%s'\n", buffer
);
132 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
133 ok(!strcmp(buffer
,"-00100") && r
==6,"' .5I64d' failed: '%s'\n", buffer
);
135 format
= "% 8.5I64d";
136 r
= sprintf(buffer
,format
,(LONGLONG
)100);
137 ok(!strcmp(buffer
," 00100") && r
==8,"' 8.5I64d' failed: '%s'\n", buffer
);
139 format
= "% 8.5I64d";
140 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
141 ok(!strcmp(buffer
," -00100") && r
==8,"' 8.5I64d' failed: '%s'\n", buffer
);
144 r
= sprintf(buffer
,format
,(LONGLONG
)0);
145 ok(r
==0,".0I64d failed: '%s'\n", buffer
);
147 format
= "%#+21.18I64x";
148 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
149 ok(!strcmp(buffer
," 0x00ffffffffffffff9c") && r
==21,"#+21.18I64x failed: '%s'\n", buffer
);
151 format
= "%#.25I64o";
152 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
153 ok(!strcmp(buffer
,"0001777777777777777777634") && r
==25,"#.25I64o failed: '%s'\n", buffer
);
155 format
= "%#+24.20I64o";
156 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
157 ok(!strcmp(buffer
," 01777777777777777777634") && r
==24,"#+24.20I64o failed: '%s'\n", buffer
);
159 format
= "%#+18.21I64X";
160 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
161 ok(!strcmp(buffer
,"0X00000FFFFFFFFFFFFFF9C") && r
==23,"#+18.21I64X failed: '%s '\n", buffer
);
163 format
= "%#+20.24I64o";
164 r
= sprintf(buffer
,format
,(LONGLONG
)-100);
165 ok(!strcmp(buffer
,"001777777777777777777634") && r
==24,"#+20.24I64o failed: '%s'\n", buffer
);
167 format
= "%#+25.22I64u";
168 r
= sprintf(buffer
,format
,(LONGLONG
)-1);
169 ok(!strcmp(buffer
," 0018446744073709551615") && r
==25,"#+25.22I64u conversion failed: '%s'\n", buffer
);
171 format
= "%#+25.22I64u";
172 r
= sprintf(buffer
,format
,(LONGLONG
)-1);
173 ok(!strcmp(buffer
," 0018446744073709551615") && r
==25,"#+25.22I64u failed: '%s'\n", buffer
);
175 format
= "%#+30.25I64u";
176 r
= sprintf(buffer
,format
,(LONGLONG
)-1);
177 ok(!strcmp(buffer
," 0000018446744073709551615") && r
==30,"#+30.25I64u failed: '%s'\n", buffer
);
179 format
= "%+#25.22I64d";
180 r
= sprintf(buffer
,format
,(LONGLONG
)-1);
181 ok(!strcmp(buffer
," -0000000000000000000001") && r
==25,"+#25.22I64d failed: '%s'\n", buffer
);
183 format
= "%#-8.5I64o";
184 r
= sprintf(buffer
,format
,(LONGLONG
)100);
185 ok(!strcmp(buffer
,"00144 ") && r
==8,"-8.5I64o failed: '%s'\n", buffer
);
187 format
= "%#-+ 08.5I64d";
188 r
= sprintf(buffer
,format
,(LONGLONG
)100);
189 ok(!strcmp(buffer
,"+00100 ") && r
==8,"'#-+ 08.5I64d failed: '%s'\n", buffer
);
191 format
= "%#-+ 08.5I64d";
192 r
= sprintf(buffer
,format
,(LONGLONG
)100);
193 ok(!strcmp(buffer
,"+00100 ") && r
==8,"#-+ 08.5I64d failed: '%s'\n", buffer
);
196 r
= sprintf(buffer
,format
,(LONGLONG
)1);
197 ok(r
==80,"%s format failed\n", format
);
199 format
= "% .80I64d";
200 r
= sprintf(buffer
,format
,(LONGLONG
)1);
201 ok(r
==81,"%s format failed\n", format
);
204 r
= sprintf(buffer
,format
,1);
205 ok(r
==81,"%s format failed\n", format
);
208 r
= sprintf(buffer
,format
,((ULONGLONG
)0xffffffff)*0xffffffff);
209 ok(!strcmp(buffer
, "1"), "Problem with \"ll\" interpretation\n");
210 ok( r
==1, "return count wrong\n");
213 r
= sprintf(buffer
,format
,1);
214 ok(!strcmp(buffer
, "I"), "Problem with \"I\" interpretation\n");
215 ok( r
==1, "return count wrong\n");
218 r
= sprintf(buffer
,format
,1);
219 ok(!strcmp(buffer
,"I0d"),"I0d failed\n");
220 ok( r
==3, "return count wrong\n");
223 r
= sprintf(buffer
,format
,1);
226 ok(!strcmp(buffer
,"1"),"I32d failed, got '%s'\n",buffer
);
230 /* Older versions don't grok I32 format */
231 ok(r
== 4 && !strcmp(buffer
,"I32d"),"I32d failed, got '%s',%d\n",buffer
,r
);
235 r
= sprintf(buffer
,format
,(LONGLONG
)-1);
236 ok(!strcmp(buffer
,"D"),"I64D failed: %s\n",buffer
);
237 ok( r
==1, "return count wrong\n");
240 r
= sprintf(buffer
,format
,1);
241 ok(!strcmp(buffer
, " 1"),"Problem with sign place-holder: '%s'\n",buffer
);
242 ok( r
==2, "return count wrong\n");
245 r
= sprintf(buffer
,format
,1);
246 ok(!strcmp(buffer
, "+1"),"Problem with sign flags: '%s'\n",buffer
);
247 ok( r
==2, "return count wrong\n");
250 r
= sprintf(buffer
,format
,wide
);
251 ok(!strcmp(buffer
,"wide"),"Problem with wide string format\n");
252 ok( r
==4, "return count wrong\n");
255 r
= sprintf(buffer
,format
,'1');
256 ok(!strcmp(buffer
,"0001"),"Character not zero-prefixed \"%s\"\n",buffer
);
257 ok( r
==4, "return count wrong\n");
260 r
= sprintf(buffer
,format
,'1');
261 ok(!strcmp(buffer
,"1 "),"Character zero-padded and/or not left-adjusted \"%s\"\n",buffer
);
262 ok( r
==4, "return count wrong\n");
265 r
= sprintf(buffer
,format
,(void *)57);
266 ok(!strcmp(buffer
,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer
);
267 ok( r
==8, "return count wrong\n");
270 r
= sprintf(buffer
,format
,(void *)57);
271 ok(!strcmp(buffer
," 0X00000039"),"Pointer formatted incorrectly\n");
272 ok( r
==12, "return count wrong\n");
275 r
= sprintf(buffer
,format
,(void *)57);
276 ok(!strcmp(buffer
,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer
);
277 ok( r
==8, "return count wrong\n");
280 r
= sprintf(buffer
,format
,"foo");
281 ok(!strcmp(buffer
,"0foo"),"String not zero-prefixed \"%s\"\n",buffer
);
282 ok( r
==4, "return count wrong\n");
285 r
= sprintf(buffer
,format
,"foo");
286 ok(!strcmp(buffer
,"f"),"Precision ignored \"%s\"\n",buffer
);
287 ok( r
==1, "return count wrong\n");
290 r
= sprintf(buffer
,format
,1,"foo");
291 ok(!strcmp(buffer
,"f"),"Precision ignored \"%s\"\n",buffer
);
292 ok( r
==1, "return count wrong\n");
295 r
= sprintf(buffer
,format
,-5,"foo");
296 ok(!strcmp(buffer
,"foo "),"Negative field width ignored \"%s\"\n",buffer
);
297 ok( r
==5, "return count wrong\n");
300 r
= sprintf(buffer
,format
,(void *)57);
301 ok(!strcmp(buffer
,"0X00000039 "),"Pointer formatted incorrectly\n");
302 ok( r
==12, "return count wrong\n");
305 r
= sprintf(buffer
, format
);
306 ok(!strcmp(buffer
,"hello"), "failed\n");
307 ok( r
==5, "return count wrong\n");
310 r
= sprintf(buffer
, format
, wide
);
311 ok(!strcmp(buffer
,"wide"), "failed\n");
312 ok( r
==4, "return count wrong\n");
315 r
= sprintf(buffer
, format
, wide
);
316 ok(!strcmp(buffer
,"wide "), "failed\n");
317 ok( r
==10, "return count wrong\n");
320 r
= sprintf(buffer
, format
, wide
);
321 ok(!strcmp(buffer
," wide"), "failed\n");
322 ok( r
==10, "return count wrong\n");
324 format
= "%#+ -03whlls";
325 r
= sprintf(buffer
, format
, wide
);
326 ok(!strcmp(buffer
,"wide"), "failed\n");
327 ok( r
==4, "return count wrong\n");
330 r
= sprintf(buffer
, format
, wide
);
331 ok(!strcmp(buffer
,"0s"), "failed\n");
332 ok( r
==2, "return count wrong\n");
335 r
= sprintf(buffer
, format
, wide
);
336 ok(!strcmp(buffer
,"-s"), "failed\n");
337 ok( r
==2, "return count wrong\n");
340 r
= sprintf(buffer
, format
, wide
);
341 ok(!strcmp(buffer
,"wide"), "failed\n");
342 ok( r
==4, "return count wrong\n");
345 r
= sprintf(buffer
, format
, "not wide" );
346 ok(!strcmp(buffer
,"not wide"), "failed\n");
347 ok( r
==8, "return count wrong\n");
350 r
= sprintf(buffer
, format
);
351 ok(!strcmp(buffer
,"b"), "failed\n");
352 ok( r
==1, "return count wrong\n");
355 r
= sprintf(buffer
, format
,'a');
356 ok(!strcmp(buffer
," a"), "failed\n");
357 ok( r
==3, "return count wrong\n");
360 r
= sprintf(buffer
, format
,1234);
361 ok(!strcmp(buffer
,"1234"), "failed\n");
362 ok( r
==4, "return count wrong\n");
365 r
= sprintf(buffer
, format
);
366 ok(!strcmp(buffer
,""), "failed\n");
367 ok( r
==0, "return count wrong\n");
369 format
= "%j%k%m%q%r%t%v%y%z";
370 r
= sprintf(buffer
, format
);
371 ok(!strcmp(buffer
,"jkmqrtvyz"), "failed\n");
372 ok( r
==9, "return count wrong\n");
376 r
= sprintf(buffer
, format
, &x
);
377 ok(x
== 4, "should write to x\n");
378 ok(!strcmp(buffer
,"asdf"), "failed\n");
379 ok( r
==4, "return count wrong\n");
382 r
= sprintf(buffer
, format
,2);
383 ok(!strcmp(buffer
,"2"), "failed\n");
384 ok( r
==1, "return count wrong\n");
387 r
= sprintf(buffer
, format
,8.6);
388 ok(!strcmp(buffer
,"8.6000"), "failed\n");
389 ok( r
==6, "return count wrong\n");
392 r
= sprintf(buffer
, format
,0.6);
393 ok(!strcmp(buffer
,"0.600000"), "failed\n");
394 ok( r
==8, "return count wrong\n");
397 r
= sprintf(buffer
, format
,0.6);
398 ok(!strcmp(buffer
,"1"), "failed\n");
399 ok( r
==1, "return count wrong\n");
403 r
= sprintf(buffer
, format
,8.6);
404 ok(!strcmp(buffer
,"8.6000e+000"), "failed\n");
405 ok( r
==11, "return count wrong\n");
409 r
= sprintf(buffer
, format
,8.6);
410 ok(!strcmp(buffer
,"8.6"), "failed\n");
411 ok( r
==3, "return count wrong\n");
414 r
= sprintf(buffer
, format
,-1);
415 ok(!strcmp(buffer
,"-1"), "failed\n");
416 ok( r
==2, "return count wrong\n");
419 r
= sprintf(buffer
, format
,1);
420 ok(!strcmp(buffer
,"1"), "failed\n");
421 ok( r
==1, "return count wrong\n");
424 r
= sprintf(buffer
, format
,1);
425 ok(!strcmp(buffer
,"+1"), "failed\n");
426 ok( r
==2, "return count wrong\n");
429 r
= sprintf(buffer
, format
,10);
430 ok(!strcmp(buffer
,"12"), "failed\n");
431 ok( r
==2, "return count wrong\n");
434 r
= sprintf(buffer
, format
,0);
435 ok(!strcmp(buffer
,"00000000"), "failed\n");
436 ok( r
==8, "return count wrong\n");
439 r
= sprintf(buffer
, format
,0);
440 ok(!strcmp(buffer
,"(null)"), "failed\n");
441 ok( r
==6, "return count wrong\n");
444 r
= sprintf(buffer
, format
,"%%%%");
445 ok(!strcmp(buffer
,"%%%%"), "failed\n");
446 ok( r
==4, "return count wrong\n");
449 r
= sprintf(buffer
, format
,-1);
450 ok(!strcmp(buffer
,"4294967295"), "failed\n");
451 ok( r
==10, "return count wrong\n");
454 r
= sprintf(buffer
, format
,-1);
455 ok(!strcmp(buffer
,""), "failed\n");
456 ok( r
==0, "return count wrong\n");
459 r
= sprintf(buffer
, format
,-1);
460 ok(!strcmp(buffer
,""), "failed\n");
461 ok( r
==0, "return count wrong\n");
464 r
= sprintf(buffer
, format
,-1);
465 ok(!strcmp(buffer
,"z"), "failed\n");
466 ok( r
==1, "return count wrong\n");
469 r
= sprintf(buffer
, format
,-1);
470 ok(!strcmp(buffer
,"j"), "failed\n");
471 ok( r
==1, "return count wrong\n");
474 r
= sprintf(buffer
, format
,-1);
475 ok(!strcmp(buffer
,""), "failed\n");
476 ok( r
==0, "return count wrong\n");
479 r
= sprintf(buffer
, format
,-1);
480 ok(!strcmp(buffer
,"H"), "failed\n");
481 ok( r
==1, "return count wrong\n");
484 r
= sprintf(buffer
, format
, 0x100+'X');
485 ok(!strcmp(buffer
,"xXx"), "failed\n");
486 ok( r
==3, "return count wrong\n");
489 r
= sprintf(buffer
, format
);
490 ok(!strcmp(buffer
,"%0"), "failed: \"%s\"\n", buffer
);
491 ok( r
==2, "return count wrong\n");
494 static void test_swprintf( void )
497 const wchar_t I64d
[] = {'%','I','6','4','d',0};
498 double pnumber
=789456123;
499 const wchar_t TwentyThreePoint15e
[]= {'%','+','#','2','3','.','1','5','e',0};
500 const wchar_t e008
[] = {'e','+','0','0','8',0};
501 const wchar_t string_w
[] = {'s','t','r','i','n','g',0};
502 const char string
[] = "string";
503 const wchar_t S
[]={'%','S',0};
504 const wchar_t hs
[] = {'%', 'h', 's', 0};
506 swprintf(buffer
,TwentyThreePoint15e
,pnumber
);
509 ok(wcsstr(buffer
,e008
) != 0,"Sprintf different\n");
511 swprintf(buffer
,I64d
,((ULONGLONG
)0xffffffff)*0xffffffff);
512 ok(wcslen(buffer
) == 11,"Problem with long long\n");
513 swprintf(buffer
,S
,string
);
514 ok(wcslen(buffer
) == 6,"Problem with \"%%S\" interpretation\n");
515 swprintf(buffer
, hs
, string
);
516 ok( wcscmp(string_w
,buffer
) == 0, "swprintf failed with %%hs\n");
519 static void test_fwprintf( void )
521 const char *string
="not a wide string";
524 ok(fwprintf(fopen("nul","r+"),(const wchar_t *)string
) == -1,
525 "Non-wide string should not be printed by fwprintf\n");
529 static void test_snprintf (void)
531 struct snprintf_test
{
535 /* Pre-2.1 libc behaviour, not C99 compliant. */
536 const struct snprintf_test tests
[] = {{"short", 5},
541 const int bufsiz
= sizeof buffer
;
544 for (i
= 0; i
< sizeof tests
/ sizeof tests
[0]; i
++) {
545 const char *fmt
= tests
[i
].format
;
546 const int expect
= tests
[i
].expected
;
547 const int n
= _snprintf (buffer
, bufsiz
, fmt
);
548 const int valid
= n
< 0 ? bufsiz
: (n
== bufsiz
? n
: n
+1);
550 ok (n
== expect
, "\"%s\": expected %d, returned %d\n",
552 ok (!memcmp (fmt
, buffer
, valid
),
553 "\"%s\": rendered \"%.*s\"\n", fmt
, valid
, buffer
);
557 static void test_fcvt(void)
560 int dec
=100, sign
=100;
562 /* Numbers less than 1.0 with different precisions */
563 str
= _fcvt(0.0001, 1, &dec
, &sign
);
564 ok( 0 == strcmp(str
,""), "bad return '%s'\n", str
);
565 ok( -3 == dec
, "dec wrong %d\n", dec
);
566 ok( 0 == sign
, "sign wrong\n");
568 str
= _fcvt(0.0001, -10, &dec
, &sign
);
569 ok( 0 == strcmp(str
,""), "bad return '%s'\n", str
);
570 ok( -3 == dec
, "dec wrong %d\n", dec
);
571 ok( 0 == sign
, "sign wrong\n");
573 str
= _fcvt(0.0001, 10, &dec
, &sign
);
574 ok( 0 == strcmp(str
,"1000000"), "bad return '%s'\n", str
);
575 ok( -3 == dec
, "dec wrong %d\n", dec
);
576 ok( 0 == sign
, "sign wrong\n");
578 /* Basic sign test */
579 str
= _fcvt(-111.0001, 5, &dec
, &sign
);
580 ok( 0 == strcmp(str
,"11100010"), "bad return '%s'\n", str
);
581 ok( 3 == dec
, "dec wrong %d\n", dec
);
582 ok( 1 == sign
, "sign wrong\n");
584 str
= _fcvt(111.0001, 5, &dec
, &sign
);
585 ok( 0 == strcmp(str
,"11100010"), "bad return '%s'\n", str
);
586 ok( 3 == dec
, "dec wrong\n");
587 ok( 0 == sign
, "sign wrong\n");
589 /* 0.0 with different precisions */
590 str
= _fcvt(0.0, 5, &dec
, &sign
);
591 ok( 0 == strcmp(str
,"00000"), "bad return '%s'\n", str
);
592 ok( 0 == dec
, "dec wrong %d\n", dec
);
593 ok( 0 == sign
, "sign wrong\n");
595 str
= _fcvt(0.0, 0, &dec
, &sign
);
596 ok( 0 == strcmp(str
,""), "bad return '%s'\n", str
);
597 ok( 0 == dec
, "dec wrong %d\n", dec
);
598 ok( 0 == sign
, "sign wrong\n");
600 str
= _fcvt(0.0, -1, &dec
, &sign
);
601 ok( 0 == strcmp(str
,""), "bad return '%s'\n", str
);
602 ok( 0 == dec
, "dec wrong %d\n", dec
);
603 ok( 0 == sign
, "sign wrong\n");
605 /* Numbers > 1.0 with 0 or -ve precision */
606 str
= _fcvt(-123.0001, 0, &dec
, &sign
);
607 ok( 0 == strcmp(str
,"123"), "bad return '%s'\n", str
);
608 ok( 3 == dec
, "dec wrong %d\n", dec
);
609 ok( 1 == sign
, "sign wrong\n");
611 str
= _fcvt(-123.0001, -1, &dec
, &sign
);
612 ok( 0 == strcmp(str
,"12"), "bad return '%s'\n", str
);
613 ok( 3 == dec
, "dec wrong %d\n", dec
);
614 ok( 1 == sign
, "sign wrong\n");
616 str
= _fcvt(-123.0001, -2, &dec
, &sign
);
617 ok( 0 == strcmp(str
,"1"), "bad return '%s'\n", str
);
618 ok( 3 == dec
, "dec wrong %d\n", dec
);
619 ok( 1 == sign
, "sign wrong\n");
621 str
= _fcvt(-123.0001, -3, &dec
, &sign
);
622 ok( 0 == strcmp(str
,""), "bad return '%s'\n", str
);
623 ok( 3 == dec
, "dec wrong %d\n", dec
);
624 ok( 1 == sign
, "sign wrong\n");
626 /* Numbers > 1.0, but with rounding at the point of precision */
627 str
= _fcvt(99.99, 1, &dec
, &sign
);
628 ok( 0 == strcmp(str
,"1000"), "bad return '%s'\n", str
);
629 ok( 3 == dec
, "dec wrong %d\n", dec
);
630 ok( 0 == sign
, "sign wrong\n");
632 /* Numbers < 1.0 where rounding occurs at the point of precision */
633 str
= _fcvt(0.00636, 2, &dec
, &sign
);
634 ok( 0 == strcmp(str
,"1"), "bad return '%s'\n", str
);
635 ok( -1 == dec
, "dec wrong %d\n", dec
);
636 ok( 0 == sign
, "sign wrong\n");
638 str
= _fcvt(0.00636, 3, &dec
, &sign
);
639 ok( 0 == strcmp(str
,"6"), "bad return '%s'\n", str
);
640 ok( -2 == dec
, "dec wrong %d\n", dec
);
641 ok( 0 == sign
, "sign wrong\n");
643 str
= _fcvt(0.09999999996, 2, &dec
, &sign
);
644 ok( 0 == strcmp(str
,"10"), "bad return '%s'\n", str
);
645 ok( 0 == dec
, "dec wrong %d\n", dec
);
646 ok( 0 == sign
, "sign wrong\n");
648 str
= _fcvt(0.6, 0, &dec
, &sign
);
649 ok( 0 == strcmp(str
,"1"), "bad return '%s'\n", str
);
650 ok( 1 == dec
, "dec wrong %d\n", dec
);
651 ok( 0 == sign
, "sign wrong\n");