1 /*************************************************************************
6 #if defined(TRIO_COMPILER_ANCIENT)
18 #if defined(TRIO_EMBED_NAN)
19 # define TRIO_PUBLIC_NAN static
20 # define TRIO_FUNC_NINF
21 # define TRIO_FUNC_PINF
22 # define TRIO_FUNC_NAN
23 # define TRIO_FUNC_ISINF
24 # define TRIO_FUNC_ISNAN
25 # if TRIO_FEATURE_FLOAT
26 # define TRIO_FUNC_NZERO
30 #if defined(TRIO_EMBED_STRING)
31 # define TRIO_PUBLIC_STRING static
32 # define TRIO_FUNC_EQUAL_CASE
37 #if TRIO_FEATURE_WIDECHAR
43 #define DOUBLE_EQUAL(x,y) (((x)>(y)-DBL_EPSILON) && ((x)<(y)+DBL_EPSILON))
44 #define FLOAT_EQUAL(x,y) (((x)>(y)-FLT_EPSILON) && ((x)<(y)+FLT_EPSILON))
46 static TRIO_CONST char rcsid[] = "@(#)$Id: regression.c,v 1.67 2010/01/26 13:02:02 breese Exp $";
48 #if defined(TRIO_EMBED_NAN)
51 #if defined(TRIO_EMBED_STRING)
55 /*************************************************************************
60 TRIO_ARGS2((buffer, rc),
66 printf("Err = %d (%s), Pos = %d\n",
69 TRIO_ERROR_POSITION(rc));
72 printf("buffer[% 3d] = \"%s\"\n", rc, buffer);
75 /*************************************************************************
80 TRIO_ARGS2((file, line),
81 TRIO_CONST char *file,
84 printf("Verification failed in %s:%d.\n", file, line);
87 /*************************************************************************
92 TRIO_ARGS4((file, line, expected, got),
93 TRIO_CONST char *file,
95 TRIO_CONST char *expected,
99 printf(" Expected \"%s\"\n", expected);
100 printf(" Got \"%s\"\n", got);
103 /*************************************************************************
108 TRIO_VARGS5((file, line, result, fmt, va_alist),
109 TRIO_CONST char *file,
111 TRIO_CONST char *result,
112 TRIO_CONST char *fmt,
119 TRIO_VA_START(args, fmt);
120 rc = trio_vsnprintf(buffer, sizeof(buffer), fmt, args);
125 if (!trio_equal_case(result, buffer))
127 Report(file, line, result, buffer);
133 /*************************************************************************
137 VerifyReturnValues(TRIO_NOARGS)
146 rc = trio_sprintf(buffer, "%s%n", "0123456789", &count);
147 trio_sprintf(result, "%d %d %s", rc, count, buffer);
148 expected = "10 10 0123456789";
149 if (!trio_equal_case(result, expected))
152 Report(__FILE__, __LINE__, expected, result);
155 rc = trio_snprintf(buffer, sizeof(buffer), "%s%n", "0123456789", &count);
156 trio_sprintf(result, "%d %d %s", rc, count, buffer);
157 expected = "10 10 0123456789";
158 if (!trio_equal_case(result, expected))
161 Report(__FILE__, __LINE__, expected, result);
164 rc = trio_snprintf(buffer, 4, "%s%n", "0123456789", &count);
165 trio_sprintf(result, "%d %d %s", rc, count, buffer);
166 expected = "10 3 012";
167 if (!trio_equal_case(result, expected))
170 Report(__FILE__, __LINE__, expected, result);
173 /* The output buffer contains the empty string */
174 rc = trio_snprintf(buffer, 1, "%s%n", "0123456789", &count);
175 trio_sprintf(result, "%d %d %s", rc, count, buffer);
177 if (!trio_equal_case(result, expected))
180 Report(__FILE__, __LINE__, expected, result);
183 /* The output buffer should be left untouched when max size is 0 */
184 trio_sprintf(buffer, "DO NOT TOUCH");
185 rc = trio_snprintf(buffer, 0, "%s%n", "0123456789", &count);
186 trio_sprintf(result, "%d %d %s", rc, count, buffer);
187 expected = "10 0 DO NOT TOUCH";
188 if (!trio_equal_case(result, expected))
191 Report(__FILE__, __LINE__, expected, result);
197 /*************************************************************************
200 #define TEST_STRING "0123456789"
203 VerifyAllocate(TRIO_NOARGS)
206 #if TRIO_FEATURE_DYNAMICSTRING
210 int test_size = sizeof(TEST_STRING) - 1;
212 /* Allocate a string with the result */
213 rc = trio_asprintf(&string, "%s%n", TEST_STRING, &count);
219 else if (count != test_size)
222 printf("Validation failed in %s:%d\n", __FILE__, __LINE__);
223 printf(" Expected %%n = %d\n", test_size);
224 printf(" Got %%n = %d\n", count);
226 else if (!trio_equal_case(string, TEST_STRING))
229 Report(__FILE__, __LINE__, TEST_STRING, string);
239 /*************************************************************************
243 VerifyFormattingStrings(TRIO_NOARGS)
248 nerrors += Verify(__FILE__, __LINE__, "Hello world",
251 nerrors += Verify(__FILE__, __LINE__, "Hello world",
252 "%s", "Hello world");
257 /*************************************************************************
261 VerifyFormattingIntegers(TRIO_NOARGS)
267 nerrors += Verify(__FILE__, __LINE__, "Number 42",
269 nerrors += Verify(__FILE__, __LINE__, "Number -42",
271 nerrors += Verify(__FILE__, __LINE__, "Number 42",
273 nerrors += Verify(__FILE__, __LINE__, "Number -42",
276 nerrors += Verify(__FILE__, __LINE__, " 1234",
278 nerrors += Verify(__FILE__, __LINE__, " 1234",
280 /* Integer width overrun */
281 nerrors += Verify(__FILE__, __LINE__, "123456",
283 /* Integer precision */
284 nerrors += Verify(__FILE__, __LINE__, "0012",
286 nerrors += Verify(__FILE__, __LINE__, "0012",
288 nerrors += Verify(__FILE__, __LINE__, " 0012",
290 nerrors += Verify(__FILE__, __LINE__, " 0012",
292 nerrors += Verify(__FILE__, __LINE__, " 0012",
293 "%*.*.*d", 6, 4, 2, 12);
294 nerrors += Verify(__FILE__, __LINE__, " 0012",
295 "%*.*.*i", 6, 4, 10, 12);
296 /* Integer sign, zero-padding, and width */
297 nerrors += Verify(__FILE__, __LINE__, "+01234",
299 nerrors += Verify(__FILE__, __LINE__, " 01234",
301 nerrors += Verify(__FILE__, __LINE__, "+01234",
303 /* Integer adjust, zero-padding, and width */
304 nerrors += Verify(__FILE__, __LINE__, "12 ",
306 /* Integer zero-padding, width, and precision */
307 nerrors += Verify(__FILE__, __LINE__, " 000012",
310 nerrors += Verify(__FILE__, __LINE__, "42",
312 nerrors += Verify(__FILE__, __LINE__, "-1",
314 nerrors += Verify(__FILE__, __LINE__, "52",
316 nerrors += Verify(__FILE__, __LINE__, "052",
318 nerrors += Verify(__FILE__, __LINE__, "0",
320 nerrors += Verify(__FILE__, __LINE__, "2a",
322 nerrors += Verify(__FILE__, __LINE__, "2A",
324 nerrors += Verify(__FILE__, __LINE__, "0x2a",
326 nerrors += Verify(__FILE__, __LINE__, "0X2A",
328 nerrors += Verify(__FILE__, __LINE__, "0x00c ",
330 nerrors += Verify(__FILE__, __LINE__, "",
332 nerrors += Verify(__FILE__, __LINE__, "",
334 nerrors += Verify(__FILE__, __LINE__, "42",
336 nerrors += Verify(__FILE__, __LINE__, "",
338 nerrors += Verify(__FILE__, __LINE__, " 0000",
340 nerrors += Verify(__FILE__, __LINE__, " 0",
342 nerrors += Verify(__FILE__, __LINE__, "00000000",
344 nerrors += Verify(__FILE__, __LINE__, "0",
346 nerrors += Verify(__FILE__, __LINE__, "52",
348 nerrors += Verify(__FILE__, __LINE__, "",
350 nerrors += Verify(__FILE__, __LINE__, "",
352 nerrors += Verify(__FILE__, __LINE__, "2a",
354 sprintf(buffer, "%u", UINT_MAX);
355 nerrors += Verify(__FILE__, __LINE__, buffer,
357 sprintf(buffer, "%x", UINT_MAX);
358 nerrors += Verify(__FILE__, __LINE__, buffer,
364 /*************************************************************************
368 VerifyFormattingFloats(TRIO_NOARGS)
372 #if TRIO_FEATURE_FLOAT
374 nerrors += Verify(__FILE__, __LINE__, "3141.000000",
376 nerrors += Verify(__FILE__, __LINE__, "3141.500000",
378 nerrors += Verify(__FILE__, __LINE__, "3.141000e+03",
380 nerrors += Verify(__FILE__, __LINE__, " -2.3420e-02",
381 "%16.4e", -2.342E-02);
382 nerrors += Verify(__FILE__, __LINE__, " -2.3420e-22",
383 "%16.4e", -2.342E-22);
384 nerrors += Verify(__FILE__, __LINE__, " 2.3420e-02",
385 "% 16.4e", 2.342E-02);
386 nerrors += Verify(__FILE__, __LINE__, " 2.3420e-02",
387 "% 1.4e", 2.342E-02);
388 nerrors += Verify(__FILE__, __LINE__, "3.141000E-44",
390 nerrors += Verify(__FILE__, __LINE__, "0",
392 nerrors += Verify(__FILE__, __LINE__, "-0",
394 nerrors += Verify(__FILE__, __LINE__, "3141.5",
396 nerrors += Verify(__FILE__, __LINE__, "3.1415E-06",
398 nerrors += Verify(__FILE__, __LINE__, "+3141.000000",
400 nerrors += Verify(__FILE__, __LINE__, "-3141.000000",
402 nerrors += Verify(__FILE__, __LINE__, "0.333333",
404 nerrors += Verify(__FILE__, __LINE__, "0.666667",
406 /* Beyond accuracy */
407 nerrors += Verify(__FILE__, __LINE__, "0.000000",
408 "%f", 1.234567890123456789e-20);
409 # if defined(TRIO_BREESE)
410 nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580299875",
412 nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991118215802998748",
414 nerrors += Verify(__FILE__, __LINE__, "1.3999999999999999111821580300",
416 nerrors += Verify(__FILE__, __LINE__, "1.399999999999999911182158",
418 nerrors += Verify(__FILE__, __LINE__, "1.39999999999999991",
420 nerrors += Verify(__FILE__, __LINE__, "1.40000000000000",
422 nerrors += Verify(__FILE__, __LINE__, "39413.800000000002910383045673370361",
426 nerrors += Verify(__FILE__, __LINE__, "0.500030517578125",
427 "%.*g", DBL_DIG + 10, 0.500030517578125);
428 /* Double decimal point */
429 nerrors += Verify(__FILE__, __LINE__, "3141",
431 nerrors += Verify(__FILE__, __LINE__, "3142",
433 nerrors += Verify(__FILE__, __LINE__, "3141",
435 nerrors += Verify(__FILE__, __LINE__, "12",
437 nerrors += Verify(__FILE__, __LINE__, "3141.000",
439 nerrors += Verify(__FILE__, __LINE__, "3141.000000",
441 nerrors += Verify(__FILE__, __LINE__, "0.0000",
443 nerrors += Verify(__FILE__, __LINE__, "0.000",
445 nerrors += Verify(__FILE__, __LINE__, "0.001000",
447 nerrors += Verify(__FILE__, __LINE__, "3141.0000",
449 nerrors += Verify(__FILE__, __LINE__, "3141.",
451 nerrors += Verify(__FILE__, __LINE__, "3141.",
453 nerrors += Verify(__FILE__, __LINE__, "11.0000",
455 nerrors += Verify(__FILE__, __LINE__, "100.00",
457 nerrors += Verify(__FILE__, __LINE__, "3e+03",
459 nerrors += Verify(__FILE__, __LINE__, "3.e+03",
461 nerrors += Verify(__FILE__, __LINE__, "1.23457e+06",
463 nerrors += Verify(__FILE__, __LINE__, "1e+02",
465 nerrors += Verify(__FILE__, __LINE__, "1.0e+02",
467 nerrors += Verify(__FILE__, __LINE__, "0.123",
469 nerrors += Verify(__FILE__, __LINE__, "1.00e+00",
471 nerrors += Verify(__FILE__, __LINE__, "1",
473 nerrors += Verify(__FILE__, __LINE__, "2",
475 nerrors += Verify(__FILE__, __LINE__, "2",
477 nerrors += Verify(__FILE__, __LINE__, "0.01",
479 nerrors += Verify(__FILE__, __LINE__, "0.010",
481 nerrors += Verify(__FILE__, __LINE__, "1e-04",
482 "%5.g", 0.999999e-4);
483 /* Double width and precision */
484 nerrors += Verify(__FILE__, __LINE__, " 1e-05",
486 nerrors += Verify(__FILE__, __LINE__, " 0.0001",
488 nerrors += Verify(__FILE__, __LINE__, " 0.001",
490 nerrors += Verify(__FILE__, __LINE__, " 0.01",
492 nerrors += Verify(__FILE__, __LINE__, " 0.1",
494 nerrors += Verify(__FILE__, __LINE__, " 1",
496 nerrors += Verify(__FILE__, __LINE__, " 10",
498 nerrors += Verify(__FILE__, __LINE__, " 100",
500 nerrors += Verify(__FILE__, __LINE__, " 1000",
502 nerrors += Verify(__FILE__, __LINE__, " 10000",
504 nerrors += Verify(__FILE__, __LINE__, " 1e+05",
506 nerrors += Verify(__FILE__, __LINE__, " 9.9e-05",
508 nerrors += Verify(__FILE__, __LINE__, " 0.00099",
510 nerrors += Verify(__FILE__, __LINE__, " 0.0099",
512 nerrors += Verify(__FILE__, __LINE__, " 0.099",
514 nerrors += Verify(__FILE__, __LINE__, " 0.99",
516 nerrors += Verify(__FILE__, __LINE__, " 9.9",
518 nerrors += Verify(__FILE__, __LINE__, " 99",
520 nerrors += Verify(__FILE__, __LINE__, " 9.9e+02",
522 nerrors += Verify(__FILE__, __LINE__, " 9.9e+03",
524 nerrors += Verify(__FILE__, __LINE__, " 9.9e+04",
526 /* Double width, precision, and alternative */
527 nerrors += Verify(__FILE__, __LINE__, " 1.0000e-05",
529 nerrors += Verify(__FILE__, __LINE__, " 0.00010000",
531 nerrors += Verify(__FILE__, __LINE__, " 0.0010000",
533 nerrors += Verify(__FILE__, __LINE__, " 0.0010000",
534 "%#11.5g", 0.999999e-3);
535 nerrors += Verify(__FILE__, __LINE__, " 0.010000",
537 nerrors += Verify(__FILE__, __LINE__, " 0.010000",
538 "%#11.5g", 0.999999e-2);
539 nerrors += Verify(__FILE__, __LINE__, " 0.10000",
541 nerrors += Verify(__FILE__, __LINE__, " 0.10000",
542 "%#11.5g", 0.999999e-1);
543 nerrors += Verify(__FILE__, __LINE__, " 1.0000",
545 nerrors += Verify(__FILE__, __LINE__, " 1.0000",
546 "%#11.5g", 0.999999e0);
547 nerrors += Verify(__FILE__, __LINE__, " 10.000",
549 nerrors += Verify(__FILE__, __LINE__, " 100.00",
551 nerrors += Verify(__FILE__, __LINE__, " 1000.0",
553 nerrors += Verify(__FILE__, __LINE__, " 10000.",
555 nerrors += Verify(__FILE__, __LINE__, " 1.0000e+05",
557 nerrors += Verify(__FILE__, __LINE__, " 9.9e-05",
559 nerrors += Verify(__FILE__, __LINE__, " 0.00099",
561 nerrors += Verify(__FILE__, __LINE__, " 0.0099",
563 nerrors += Verify(__FILE__, __LINE__, " 0.099",
565 nerrors += Verify(__FILE__, __LINE__, " 0.99",
567 nerrors += Verify(__FILE__, __LINE__, " 9.9",
569 nerrors += Verify(__FILE__, __LINE__, " 99.",
571 nerrors += Verify(__FILE__, __LINE__, " 9.9e+02",
573 nerrors += Verify(__FILE__, __LINE__, " 9.9e+03",
575 nerrors += Verify(__FILE__, __LINE__, " 9.9e+04",
577 /* Double width, precision, and zero padding */
578 nerrors += Verify(__FILE__, __LINE__, "00003.141500e+03",
580 nerrors += Verify(__FILE__, __LINE__, " 3.141500e+03",
582 nerrors += Verify(__FILE__, __LINE__, "3.141500e+03 ",
584 nerrors += Verify(__FILE__, __LINE__, "03.142e+03",
586 #if !defined(TRIO_COMPILER_ANCIENT)
588 nerrors += Verify(__FILE__, __LINE__, "1.400000",
593 nerrors += Verify(__FILE__, __LINE__, "1.00",
595 nerrors += Verify(__FILE__, __LINE__, "100",
597 nerrors += Verify(__FILE__, __LINE__, "inf",
599 nerrors += Verify(__FILE__, __LINE__, "-inf",
601 nerrors += Verify(__FILE__, __LINE__, "INF",
603 nerrors += Verify(__FILE__, __LINE__, "-INF",
605 /* May fail if NaN is unsupported */
606 nerrors += Verify(__FILE__, __LINE__, "nan",
608 nerrors += Verify(__FILE__, __LINE__, "NAN",
611 # if TRIO_FEATURE_HEXFLOAT
612 nerrors += Verify(__FILE__, __LINE__, "0x2.ap+4",
614 nerrors += Verify(__FILE__, __LINE__, "-0x2.ap+4",
616 nerrors += Verify(__FILE__, __LINE__, "0x1.8p+0",
618 nerrors += Verify(__FILE__, __LINE__, "0x1.6666666666666p+0",
620 nerrors += Verify(__FILE__, __LINE__, "0xc.45p+8",
622 nerrors += Verify(__FILE__, __LINE__, "0XC.45P+8",
624 nerrors += Verify(__FILE__, __LINE__, "0xb.351c434a98fa8p-148",
628 #endif /* TRIO_FEATURE_FLOAT */
633 /*************************************************************************
637 int number_writer(void *ref)
642 format = trio_get_format(ref);
643 if ((format) && trio_equal(format, "integer"))
645 data = trio_get_argument(ref);
648 trio_print_int(ref, *data);
657 VerifyFormattingUserDefined(TRIO_NOARGS)
664 number_handle = trio_register(number_writer, "number");
667 nerrors += Verify(__FILE__, __LINE__, "123",
668 "%<number:integer>", &integer);
671 nerrors += Verify(__FILE__, __LINE__, "123",
672 "$<number:integer|%p>", &integer);
673 nerrors += Verify(__FILE__, __LINE__, "123",
674 "$<integer|%p%p>", number_handle, &integer);
675 nerrors += Verify(__FILE__, __LINE__, "$<integer|123",
676 "$<integer|%d", 123);
677 nerrors += Verify(__FILE__, __LINE__, "$integer|123>",
678 "$integer|%d>", 123);
680 trio_unregister(number_handle);
686 /*************************************************************************
690 VerifyFormattingRegression(TRIO_NOARGS)
694 #if TRIO_FEATURE_FLOAT
695 /* 0.6 was formatted as 0.600000e+00 */
696 nerrors += Verify(__FILE__, __LINE__, "5.000000e-01",
698 nerrors += Verify(__FILE__, __LINE__, "6.000000e-01",
705 /*************************************************************************
709 VerifyFormatting(TRIO_NOARGS)
712 #if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER
716 nerrors += VerifyFormattingStrings();
717 nerrors += VerifyFormattingIntegers();
718 nerrors += VerifyFormattingFloats();
719 nerrors += VerifyFormattingRegression();
720 nerrors += VerifyFormattingUserDefined();
723 if (sizeof(void *) == 4)
725 nerrors += Verify(__FILE__, __LINE__, "Pointer 0x01234567",
726 "Pointer %p", 0x1234567);
728 #if defined(TRIO_COMPILER_SUPPORTS_LL)
729 else if (sizeof(void *) == 8)
731 nerrors += Verify(__FILE__, __LINE__, "Pointer 0x0123456789012345",
732 "Pointer %p", 0x123456789012345LL);
736 nerrors += Verify(__FILE__, __LINE__, "Pointer (nil)",
739 /* Char width alignment */
740 nerrors += Verify(__FILE__, __LINE__, "Char X .",
742 /* String width / precision */
743 nerrors += Verify(__FILE__, __LINE__, " testing",
745 nerrors += Verify(__FILE__, __LINE__, "testing ",
747 nerrors += Verify(__FILE__, __LINE__, " testing",
748 "%*s", 8, "testing");
749 nerrors += Verify(__FILE__, __LINE__, "testing ",
750 "%*s", -8, "testing");
751 nerrors += Verify(__FILE__, __LINE__, "test",
753 nerrors += Verify(__FILE__, __LINE__, "test",
754 "%.*s", 4, "testing");
755 nerrors += Verify(__FILE__, __LINE__, "testing",
756 "%.*s", -4, "testing");
757 #if TRIO_FEATURE_POSITIONAL
759 nerrors += Verify(__FILE__, __LINE__, "222 111",
760 "%2$s %1$s", "111", "222");
761 nerrors += Verify(__FILE__, __LINE__, "123456 12345 0001234 00123",
762 "%4$d %3$*8$d %2$.*7$d %1$*6$.*5$d",
763 123, 1234, 12345, 123456, 5, 6, 7, 8);
766 #if TRIO_FEATURE_SIZE_T_UPPER
767 nerrors += Verify(__FILE__, __LINE__, "256",
768 "%Zd", sizeof(buffer));
771 #if TRIO_FEATURE_ERRNO
773 # if defined(TRIO_PLATFORM_LYNX)
774 # if defined(PREDEF_STANDARD_POSIX_1996)
775 nerrors += Verify(__FILE__, __LINE__, "Interrupted system call ",
778 nerrors += Verify(__FILE__, __LINE__, "System call interrupted",
782 nerrors += Verify(__FILE__, __LINE__, "Interrupted system call",
787 #if TRIO_FEATURE_QUAD
788 # if defined(TRIO_COMPILER_SUPPORTS_LL)
789 /* This may fail if the preprocessor does not recognize LL */
790 nerrors += Verify(__FILE__, __LINE__, "42",
795 #if TRIO_FEATURE_SIZE_T
796 nerrors += Verify(__FILE__, __LINE__, "256",
797 "%zd", sizeof(buffer));
799 #if TRIO_FEATURE_PTRDIFF_T
800 nerrors += Verify(__FILE__, __LINE__, "42",
803 #if TRIO_FEATURE_INTMAX_T
804 # if defined(TRIO_COMPILER_SUPPORTS_LL)
805 /* Some compilers may not handle the LL suffix correctly */
806 nerrors += Verify(__FILE__, __LINE__, "42",
811 #if TRIO_FEATURE_WIDECHAR
812 nerrors += Verify(__FILE__, __LINE__, "Hello World",
813 "%ls", L"Hello World");
814 nerrors += Verify(__FILE__, __LINE__, "\\aHello World",
815 "%#ls", L"\aHello World");
816 nerrors += Verify(__FILE__, __LINE__, "A",
818 nerrors += Verify(__FILE__, __LINE__, "\\a",
822 #if TRIO_FEATURE_FIXED_SIZE
823 nerrors += Verify(__FILE__, __LINE__, "42",
825 nerrors += Verify(__FILE__, __LINE__, "ffffffff",
830 nerrors += Verify(__FILE__, __LINE__, " 42 86",
832 nerrors += Verify(__FILE__, __LINE__, "0042 0086",
834 nerrors += Verify(__FILE__, __LINE__, "42",
835 "%&d", sizeof(long), 42L);
836 /* Non-printable string */
837 nerrors += Verify(__FILE__, __LINE__, "NonPrintable \\x01 \\a \\\\",
838 "NonPrintable %#s", "\01 \07 \\");
839 nerrors += Verify(__FILE__, __LINE__, "\\a \\b \\t \\n \\v \\f \\r",
840 "%#s", "\007 \010 \011 \012 \013 \014 \015");
842 nerrors += Verify(__FILE__, __LINE__, "Another \"quoted\" string",
843 "Another %'s string", "quoted");
845 nerrors += Verify(__FILE__, __LINE__, "Number 42 == 1120 (base 3)",
846 "Number %d == %..3i (base 3)", 42, 42);
847 /* Integer base (specifier base must be used instead of base modifier) */
848 nerrors += Verify(__FILE__, __LINE__, "42",
850 nerrors += Verify(__FILE__, __LINE__, "52",
852 nerrors += Verify(__FILE__, __LINE__, "2a",
854 /* Integer thousand separator */
855 nerrors += Verify(__FILE__, __LINE__, "Number 100",
857 nerrors += Verify(__FILE__, __LINE__, "Number 1,000,000",
858 "Number %'d", 1000000);
859 # if TRIO_FEATURE_FLOAT
860 /* Float thousand separator */
861 nerrors += Verify(__FILE__, __LINE__, "31,415.200000",
863 nerrors += Verify(__FILE__, __LINE__, "1,000,000.000000",
865 /* Rounding modifier */
866 nerrors += Verify(__FILE__, __LINE__, "1.4",
868 nerrors += Verify(__FILE__, __LINE__, "1.4",
870 nerrors += Verify(__FILE__, __LINE__, "39413.8",
872 # if !defined(TRIO_COMPILER_ANCIENT)
874 nerrors += Verify(__FILE__, __LINE__, "1.4",
876 nerrors += Verify(__FILE__, __LINE__, "1.4",
882 #if defined(TRIO_BREESE)
884 * These results depends on issues beyond our control. For example,
885 * the accuracy of floating-point numbers depends on the underlying
886 * floating-point hardware (e.g. whether IEEE 754 double or extended-
887 * double format is used).
889 * These tests are therefore not part of the normal regression test,
890 * but we keep them here for development purposes.
892 nerrors += Verify(__FILE__, __LINE__, "123456789012345680868.000000",
893 "%f", 1.234567890123456789e20);
894 nerrors += Verify(__FILE__, __LINE__, "1.23456789012345677901e-20",
895 "%.20e", 1.2345678901234567e-20);
896 nerrors += Verify(__FILE__, __LINE__, "0.666666666666666629659233",
897 "%.*g", DBL_DIG + 10, 2.0/3.0);
898 nerrors += Verify(__FILE__, __LINE__, "123456789012345700000",
899 "%Rf", 1.234567890123456789e20);
900 # if !defined(TRIO_COMPILER_ANCIENT)
901 nerrors += Verify(__FILE__, __LINE__, "0.666666666666666667",
902 "%RLf", (2.0L/3.0L));
903 nerrors += Verify(__FILE__, __LINE__, "0.666666666666666667",
904 "%.30RLf", (2.0L/3.0L));
911 /*************************************************************************
915 VerifyErrors(TRIO_NOARGS)
921 /* Error: Invalid argument 1 */
922 rc = trio_snprintf(buffer, sizeof(buffer), "%d %r", 42, "text");
923 #if TRIO_FEATURE_ERRORCODE
924 # if TRIO_FEATURE_STRERR
925 trio_snprintf(buffer, sizeof(buffer), "Err = %d (%s), Pos = %d",
928 TRIO_ERROR_POSITION(rc));
929 nerrors += Verify(__FILE__, __LINE__, "Err = 2 (Invalid argument), Pos = 5",
932 trio_snprintf(buffer, sizeof(buffer), "Err = %d, Pos = %d",
934 TRIO_ERROR_POSITION(rc));
935 nerrors += Verify(__FILE__, __LINE__, "Err = 2, Pos = 5",
939 nerrors += (rc != -1);
942 /* Error: Invalid argument 2 */
943 rc = trio_snprintf(buffer, sizeof(buffer), "%#");
944 #if TRIO_FEATURE_ERRORCODE
945 # if TRIO_FEATURE_STRERR
946 trio_snprintf(buffer, sizeof(buffer), "Err = %d (%s), Pos = %d",
949 TRIO_ERROR_POSITION(rc));
950 nerrors += Verify(__FILE__, __LINE__, "Err = 2 (Invalid argument), Pos = 3",
953 trio_snprintf(buffer, sizeof(buffer), "Err = %d, Pos = %d",
955 TRIO_ERROR_POSITION(rc));
956 nerrors += Verify(__FILE__, __LINE__, "Err = 2, Pos = 3",
960 nerrors += (rc != -1);
963 /* Error: Invalid argument 3 */
964 rc = trio_snprintf(buffer, sizeof(buffer), "%hhhd", 42);
965 #if TRIO_FEATURE_ERRORCODE
966 # if TRIO_FEATURE_STRERR
967 trio_snprintf(buffer, sizeof(buffer), "Err = %d (%s), Pos = %d",
970 TRIO_ERROR_POSITION(rc));
971 nerrors += Verify(__FILE__, __LINE__, "Err = 2 (Invalid argument), Pos = 4",
974 trio_snprintf(buffer, sizeof(buffer), "Err = %d, Pos = %d",
976 TRIO_ERROR_POSITION(rc));
977 nerrors += Verify(__FILE__, __LINE__, "Err = 2, Pos = 4",
981 nerrors += (rc != -1);
984 /* Error: Double reference */
985 rc = trio_snprintf(buffer, sizeof(buffer), "hello %1$d %1$d", 31, 32);
986 #if TRIO_FEATURE_ERRORCODE
987 # if TRIO_FEATURE_STRERR
988 trio_snprintf(buffer, sizeof(buffer), "Err = %d (%s), Pos = %d",
991 TRIO_ERROR_POSITION(rc));
993 nerrors += Verify(__FILE__, __LINE__, "Err = 4 (Double reference), Pos = 0",
996 nerrors += Verify(__FILE__, __LINE__, "Err = 2 (Invalid argument), Pos = 9",
1000 trio_snprintf(buffer, sizeof(buffer), "Err = %d, Pos = %d",
1001 TRIO_ERROR_CODE(rc),
1002 TRIO_ERROR_POSITION(rc));
1004 nerrors += Verify(__FILE__, __LINE__, "Err = 4, Pos = 0",
1007 nerrors += Verify(__FILE__, __LINE__, "Err = 2, Pos = 9",
1012 nerrors += (rc != -1);
1015 /* Error: Reference gap */
1016 rc = trio_snprintf(buffer, sizeof(buffer), "%3$d %1$d", 31, 32, 33);
1017 #if TRIO_FEATURE_ERRORCODE
1018 # if TRIO_FEATURE_STRERR
1019 trio_snprintf(buffer, sizeof(buffer), "Err = %d (%s), Pos = %d",
1020 TRIO_ERROR_CODE(rc),
1021 TRIO_ERROR_NAME(rc),
1022 TRIO_ERROR_POSITION(rc));
1024 nerrors += Verify(__FILE__, __LINE__, "Err = 5 (Reference gap), Pos = 1",
1027 nerrors += Verify(__FILE__, __LINE__, "Err = 2 (Invalid argument), Pos = 3",
1031 trio_snprintf(buffer, sizeof(buffer), "Err = %d, Pos = %d",
1032 TRIO_ERROR_CODE(rc),
1033 TRIO_ERROR_POSITION(rc));
1035 nerrors += Verify(__FILE__, __LINE__, "Err = 5, Pos = 1",
1038 nerrors += Verify(__FILE__, __LINE__, "Err = 2, Pos = 3",
1043 nerrors += (rc != -1);
1049 /*************************************************************************
1052 #if TRIO_FEATURE_SCANF
1054 VerifyScanningOneInteger
1055 TRIO_ARGS5((file, line, expected, format, original),
1056 TRIO_CONST char *file,
1058 TRIO_CONST char *expected,
1059 TRIO_CONST char *format,
1065 trio_snprintf(data, sizeof(data), format, original);
1066 trio_sscanf(data, format, &number);
1067 return Verify(file, line, expected, format, number);
1071 VerifyScanningIntegers(TRIO_NOARGS)
1075 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "42",
1077 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "42",
1079 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "-42",
1081 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "2147483647",
1083 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "42",
1085 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "2a",
1087 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "52",
1089 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "101010",
1091 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "0x2a",
1093 nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, "052",
1100 /*************************************************************************
1103 #if TRIO_FEATURE_SCANF
1105 VerifyScanningOneFloat
1106 TRIO_ARGS5((file, line, expected, format, original),
1107 TRIO_CONST char *file,
1109 TRIO_CONST char *expected,
1110 TRIO_CONST char *format,
1116 trio_snprintf(data, sizeof(data), format, original);
1117 trio_sscanf(data, format, &number);
1118 return Verify(file, line, expected, format, number);
1122 VerifyScanningOneDouble
1123 TRIO_ARGS5((file, line, expected, format, original),
1124 TRIO_CONST char *file,
1126 TRIO_CONST char *expected,
1127 TRIO_CONST char *format,
1133 trio_snprintf(data, sizeof(data), format, original);
1134 trio_sscanf(data, format, &number);
1135 return Verify(file, line, expected, format, number);
1139 VerifyScanningFloats(TRIO_NOARGS)
1143 #if TRIO_FEATURE_FLOAT
1144 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "42.000000",
1146 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "-42.000000",
1148 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "4.200000e+01",
1150 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "4.200000E+01",
1152 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "42",
1154 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.23457e+06",
1156 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.23457e-06",
1158 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.23457E+06",
1160 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.234567e+06",
1162 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.234500e+00",
1164 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.234567e+06",
1166 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.2345670000e+06",
1167 "%.10e", 1234567.0);
1168 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1.23457e+06",
1170 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "1234567",
1171 "%.10g", 1234567.0);
1172 # if TRIO_FEATURE_HEXFLOAT
1173 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "0x2.ap+4",
1175 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "0x1.2d687p+20",
1177 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "0X1.2D687P+20",
1180 nerrors += VerifyScanningOneDouble(__FILE__, __LINE__, "1.79769e+308",
1181 "%lg", 1.79769e+308);
1182 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "nan",
1184 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "NAN",
1186 nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, "-inf",
1194 /*************************************************************************
1197 #if TRIO_FEATURE_SCANF
1199 VerifyScanningOneString
1200 TRIO_ARGS5((file, line, expected, format, original),
1201 TRIO_CONST char *file,
1203 TRIO_CONST char *expected,
1204 TRIO_CONST char *format,
1210 trio_snprintf(data, sizeof(data), "%s", original);
1212 trio_sscanf(data, format, string);
1213 return Verify(file, line, expected, "%s", string);
1217 VerifyScanningStrings(TRIO_NOARGS)
1221 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "",
1223 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "",
1225 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "hello",
1227 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "hello",
1228 "%s", "hello world");
1229 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "hello world",
1230 "%[^\n]", "hello world");
1231 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "(nil)",
1233 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "hello",
1235 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "he",
1237 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "ab",
1239 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "abcba",
1241 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "abcba",
1244 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "abcba",
1245 "%[[:alpha:]]", "abcba");
1247 nerrors += VerifyScanningOneString(__FILE__, __LINE__, "ba",
1248 "%*[ab]c%[^\n]", "abcba");
1254 /*************************************************************************
1257 #if TRIO_FEATURE_SCANF
1259 VerifyScanningRegression(TRIO_NOARGS)
1263 #if TRIO_FEATURE_FLOAT
1266 # if defined(TRIO_BREESE)
1267 trio_long_double_t ldnumber;
1276 #if TRIO_FEATURE_FLOAT
1277 rc = trio_sscanf("1.5", "%lf%n", &dnumber, &offset);
1278 nerrors += Verify(__FILE__, __LINE__, "1 3 1.500000",
1279 "%d %d %f", rc, offset, dnumber);
1281 rc = trio_sscanf("q 123", "%c%ld", &ch, &lnumber);
1282 nerrors += Verify(__FILE__, __LINE__, "q 123",
1283 "%c %ld", ch, lnumber);
1284 rc = trio_sscanf("abc", "%*s%n", &number);
1285 nerrors += Verify(__FILE__, __LINE__, "0 3",
1286 "%d %d", rc, number);
1287 rc = trio_sscanf("abc def", "%*s%n", &number);
1288 nerrors += Verify(__FILE__, __LINE__, "0 3",
1289 "%d %d", rc, number);
1290 #if TRIO_FEATURE_FLOAT
1291 rc = trio_sscanf("0.141882295971771490", "%lf", &dnumber);
1295 rc = trio_sscanf("total 1", "total %d", &number);
1296 nerrors += Verify(__FILE__, __LINE__, "1 1",
1297 "%d %d", rc, number);
1298 #if defined(TRIO_BREESE)
1299 # if TRIO_FEATURE_FLOAT
1300 nerrors += Verify(__FILE__, __LINE__, "1 0.141882295971771488",
1301 "%d %.18f", rc, dnumber);
1302 rc = trio_sscanf("0.141882295971771490", "%Lf", &ldnumber);
1303 nerrors += Verify(__FILE__, __LINE__, "1 0.141882295971771490",
1304 "%d %.18Lf", rc, ldnumber);
1307 #if TRIO_FEATURE_FLOAT
1308 rc = trio_sscanf("1.e-6", "%lg", &dnumber);
1309 nerrors += Verify(__FILE__, __LINE__, "1e-06",
1311 rc = trio_sscanf("1e-6", "%lg", &dnumber);
1312 nerrors += Verify(__FILE__, __LINE__, "1e-06",
1316 /* Do not overwrite result on matching error */
1318 rc = trio_sscanf("0123456789", "%1[c]", &ch);
1319 nerrors += Verify(__FILE__, __LINE__, "a",
1322 /* Scan plus prefix for unsigned integer */
1323 rc = trio_sscanf("+42", "%u", &number);
1324 nerrors += Verify(__FILE__, __LINE__, "1 42",
1325 "%d %u", rc, number);
1327 /* Scan minus prefix even for unsigned integer */
1328 rc = trio_sscanf("-42", "%u", &number);
1329 sprintf(buffer, "1 %u", -42U);
1330 nerrors += Verify(__FILE__, __LINE__, buffer,
1331 "%d %u", rc, number);
1333 /* A scangroup match failure should not bind its argument,
1334 * i.e., it shouldn't match the empty string. */
1335 sprintf(buffer, "SPQR");
1336 rc = trio_sscanf("asdf", "%[c]", buffer);
1337 nerrors += Verify(__FILE__, __LINE__, "0 SPQR",
1338 "%d %s", rc, buffer);
1340 /* Even whitespace scanning shouldn't try to read past EOF */
1342 trio_fprintf(stream, "");
1344 rc = trio_fscanf(stream, " ");
1345 nerrors += Verify(__FILE__, __LINE__, "0",
1349 /* Idem, after a succesfull read */
1351 trio_fprintf(stream, "123");
1353 rc = trio_fscanf(stream, "%i ", &number);
1354 nerrors += Verify(__FILE__, __LINE__, "1 123",
1355 "%d %i", rc, number);
1358 /* The scanner should unget its read-ahead char */
1360 trio_fprintf(stream, "123");
1362 trio_fscanf(stream, "%*c");
1363 trio_fscanf(stream, "%c", &ch);
1364 nerrors += Verify(__FILE__, __LINE__, "2",
1372 /*************************************************************************
1376 VerifyScanning(TRIO_NOARGS)
1379 #if TRIO_FEATURE_SCANF
1380 nerrors += VerifyScanningIntegers();
1381 nerrors += VerifyScanningFloats();
1382 nerrors += VerifyScanningStrings();
1383 nerrors += VerifyScanningRegression();
1388 /*************************************************************************
1392 VerifyStrings(TRIO_NOARGS)
1395 #if !defined(TRIO_MINIMAL)
1397 #if TRIO_FEATURE_FLOAT
1404 trio_copy(buffer, "Find me now");
1405 if (trio_length(buffer) != sizeof("Find me now") - 1) {
1407 Report0(__FILE__, __LINE__);
1409 if (!trio_equal(buffer, "Find me now")) {
1411 Report0(__FILE__, __LINE__);
1413 if (!trio_equal_case(buffer, "Find me now")) {
1415 Report0(__FILE__, __LINE__);
1417 if (trio_equal_case(buffer, "FIND ME NOW")) {
1419 Report0(__FILE__, __LINE__);
1421 if (!trio_equal_max(buffer, sizeof("Find me") - 1, "Find ME")) {
1423 Report0(__FILE__, __LINE__);
1425 if (!trio_contains(buffer, "me")) {
1427 Report0(__FILE__, __LINE__);
1429 if (trio_contains(buffer, "and me")) {
1431 Report0(__FILE__, __LINE__);
1433 if (trio_substring(buffer, "me") == NULL) {
1435 Report0(__FILE__, __LINE__);
1437 if (trio_substring_max(buffer, 4, "me") != NULL) {
1439 Report0(__FILE__, __LINE__);
1441 if (!trio_match(buffer, "* me *")) {
1443 Report0(__FILE__, __LINE__);
1445 if (trio_match_case(buffer, "* ME *")) {
1447 Report0(__FILE__, __LINE__);
1449 if (trio_index(buffer, 'n') == NULL) {
1451 Report0(__FILE__, __LINE__);
1453 if (trio_index(buffer, '_') != NULL) {
1455 Report0(__FILE__, __LINE__);
1457 if (trio_index_last(buffer, 'n') == NULL) {
1459 Report0(__FILE__, __LINE__);
1463 trio_copy(buffer, "Find me now");
1464 if (!trio_append(buffer, " and again")) {
1466 Report0(__FILE__, __LINE__);
1468 if (!trio_equal(buffer, "Find me now and again")) {
1470 Report0(__FILE__, __LINE__);
1472 if (!trio_append_max(buffer, 0, "should not appear")) {
1474 Report0(__FILE__, __LINE__);
1476 if (!trio_equal(buffer, "Find me now and again")) {
1478 Report0(__FILE__, __LINE__);
1481 /* To upper/lower */
1482 trio_copy(buffer, "Find me now");
1484 if (!trio_equal_case(buffer, "FIND ME NOW")) {
1486 Report0(__FILE__, __LINE__);
1489 if (!trio_equal_case(buffer, "find me now")) {
1491 Report0(__FILE__, __LINE__);
1494 #if TRIO_FEATURE_FLOAT
1495 /* Double conversion */
1496 trio_copy(buffer, "3.1415");
1497 dnumber = trio_to_double(buffer, NULL);
1498 if (!DOUBLE_EQUAL(dnumber, 3.1415)) {
1500 Report0(__FILE__, __LINE__);
1502 fnumber = trio_to_float(buffer, NULL);
1503 if (!FLOAT_EQUAL(fnumber, 3.1415)) {
1505 Report0(__FILE__, __LINE__);
1509 /* Long conversion */
1510 trio_copy(buffer, "3.1415");
1511 if (trio_to_long(buffer, NULL, 10) != 3L) {
1513 Report0(__FILE__, __LINE__);
1515 if (trio_to_long(buffer, NULL, 4) != 3L) {
1517 Report0(__FILE__, __LINE__);
1519 trio_to_long(buffer, &end, 2);
1520 if (end != buffer) {
1522 Report0(__FILE__, __LINE__);
1525 #endif /* !defined(TRIO_MINIMAL) */
1529 /*************************************************************************
1533 VerifyDynamicStrings(TRIO_NOARGS)
1536 #if !defined(TRIO_MINIMAL)
1537 trio_string_t *string;
1538 const char no_terminate[5] = { 'h', 'e', 'l', 'l', 'o' };
1540 string = trio_xstring_duplicate("Find me now");
1541 if (string == NULL) {
1545 if (!trio_xstring_equal(string, "FIND ME NOW"))
1547 if (!trio_xstring_append(string, " and again") ||
1548 !trio_xstring_equal(string, "FIND ME NOW AND AGAIN"))
1550 if (!trio_xstring_contains(string, "me"))
1552 if (trio_xstring_contains(string, "ME"))
1554 if (!trio_xstring_match(string, "* me *"))
1556 if (trio_xstring_match_case(string, "* ME *"))
1558 if (!trio_xstring_append_max(string, no_terminate, 5) ||
1559 !trio_xstring_equal(string, "FIND ME NOW AND AGAINhello"))
1564 trio_string_destroy(string);
1566 #endif /* !defined(TRIO_MINIMAL) */
1570 /*************************************************************************
1574 VerifyNaN(TRIO_NOARGS)
1576 double ninf_number = trio_ninf();
1577 double pinf_number = trio_pinf();
1578 double nan_number = trio_nan();
1581 nerrors += Verify(__FILE__, __LINE__, "-1",
1582 "%d", trio_isinf(ninf_number));
1583 nerrors += Verify(__FILE__, __LINE__, "0",
1584 "%d", trio_isinf(42.0));
1585 nerrors += Verify(__FILE__, __LINE__, "1",
1586 "%d", trio_isinf(pinf_number));
1587 nerrors += Verify(__FILE__, __LINE__, "1",
1588 "%d", trio_isnan(nan_number));
1589 nerrors += Verify(__FILE__, __LINE__, "0",
1590 "%d", trio_isnan(42.0));
1595 /*************************************************************************
1603 printf("%s\n", rcsid);
1606 /* Override system locale settings */
1607 trio_locale_set_decimal_point(".");
1608 trio_locale_set_thousand_separator(",");
1609 trio_locale_set_grouping("\3");
1612 printf("Verifying strings\n");
1613 nerrors += VerifyStrings();
1615 printf("Verifying dynamic strings\n");
1616 nerrors += VerifyDynamicStrings();
1618 printf("Verifying special quantities\n");
1619 nerrors += VerifyNaN();
1621 printf("Verifying formatting\n");
1622 nerrors += VerifyFormatting();
1624 printf("Verifying scanning\n");
1625 nerrors += VerifyScanning();
1627 printf("Verifying return values\n");
1628 nerrors += VerifyErrors();
1629 nerrors += VerifyReturnValues();
1631 printf("Verifying allocation\n");
1632 nerrors += VerifyAllocate();
1635 printf("Regression test succeeded\n");
1637 printf("Regression test failed in %d instance(s)\n", nerrors);
1639 return nerrors ? 1 : 0;