1b9385720SDag-Erling Smørgrav /*- 2b9385720SDag-Erling Smørgrav * Copyright (c) 2023 Dag-Erling Smørgrav 3b9385720SDag-Erling Smørgrav * 4b9385720SDag-Erling Smørgrav * SPDX-License-Identifier: BSD-2-Clause 5b9385720SDag-Erling Smørgrav */ 6b9385720SDag-Erling Smørgrav 7b9385720SDag-Erling Smørgrav #include <assert.h> 8b9385720SDag-Erling Smørgrav #include <limits.h> 9b9385720SDag-Erling Smørgrav #include <locale.h> 10b9385720SDag-Erling Smørgrav #include <stdint.h> 11b9385720SDag-Erling Smørgrav #include <stdio.h> 12b9385720SDag-Erling Smørgrav 13b9385720SDag-Erling Smørgrav #include <atf-c.h> 14b9385720SDag-Erling Smørgrav 15*4ec9ee99SDag-Erling Smørgrav #ifndef nitems 16*4ec9ee99SDag-Erling Smørgrav #define nitems(a) (sizeof(a) / sizeof(a[0])) 17*4ec9ee99SDag-Erling Smørgrav #endif 18*4ec9ee99SDag-Erling Smørgrav 19b9385720SDag-Erling Smørgrav #define SNPRINTF_TEST(output, format, ...) \ 20b9385720SDag-Erling Smørgrav do { \ 21b9385720SDag-Erling Smørgrav char buf[256]; \ 22*4ec9ee99SDag-Erling Smørgrav assert(strlen(output) < nitems(buf)); \ 23*4ec9ee99SDag-Erling Smørgrav int ret = snprintf(buf, nitems(buf), format, \ 24*4ec9ee99SDag-Erling Smørgrav __VA_ARGS__); \ 25b9385720SDag-Erling Smørgrav ATF_CHECK_EQ(strlen(output), ret); \ 26b9385720SDag-Erling Smørgrav if (ret > 0) { \ 27*4ec9ee99SDag-Erling Smørgrav ATF_CHECK_EQ(0, strcmp(output, buf)); \ 28b9385720SDag-Erling Smørgrav } \ 29b9385720SDag-Erling Smørgrav } while (0) 30b9385720SDag-Erling Smørgrav 31b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_b); 32b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_b, tc) 33b9385720SDag-Erling Smørgrav { 34b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%b", 0); 35b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%12b", 0); 36b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%012b", 0); 37b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1", "%b", 1); 38b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 1", "%12b", 1); 39b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000001", "%012b", 1); 40b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX); 41b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%#b", 0); 42b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%#12b", 0); 43b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%#012b", 0); 44b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0b1", "%#b", 1); 45b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0b1", "%#12b", 1); 46b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0b0000000001", "%#012b", 1); 47b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX); 48b9385720SDag-Erling Smørgrav } 49b9385720SDag-Erling Smørgrav 50b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_B); 51b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_B, tc) 52b9385720SDag-Erling Smørgrav { 53b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%B", 0); 54b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%12B", 0); 55b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%012B", 0); 56b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1", "%B", 1); 57b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 1", "%12B", 1); 58b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000001", "%012B", 1); 59b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX); 60b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%#B", 0); 61b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%#12B", 0); 62b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%#012B", 0); 63b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0B1", "%#B", 1); 64b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0B1", "%#12B", 1); 65b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0B0000000001", "%#012B", 1); 66b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX); 67b9385720SDag-Erling Smørgrav } 68b9385720SDag-Erling Smørgrav 69b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_d); 70b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_d, tc) 71b9385720SDag-Erling Smørgrav { 72b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%d", 0); 73b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%12d", 0); 74b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%012d", 0); 75b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1", "%d", 1); 76b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 1", "%12d", 1); 77b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000001", "%012d", 1); 78b9385720SDag-Erling Smørgrav SNPRINTF_TEST("2147483647", "%d", INT_MAX); 79b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 2147483647", "%12d", INT_MAX); 80b9385720SDag-Erling Smørgrav SNPRINTF_TEST("002147483647", "%012d", INT_MAX); 81b9385720SDag-Erling Smørgrav SNPRINTF_TEST("2,147,483,647", "%'d", INT_MAX); 82b9385720SDag-Erling Smørgrav } 83b9385720SDag-Erling Smørgrav 84b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_x); 85b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_x, tc) 86b9385720SDag-Erling Smørgrav { 87b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%x", 0); 88b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%12x", 0); 89b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%012x", 0); 90b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1", "%x", 1); 91b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 1", "%12x", 1); 92b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000001", "%012x", 1); 93b9385720SDag-Erling Smørgrav SNPRINTF_TEST("7fffffff", "%x", INT_MAX); 94b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 7fffffff", "%12x", INT_MAX); 95b9385720SDag-Erling Smørgrav SNPRINTF_TEST("00007fffffff", "%012x", INT_MAX); 96b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%#x", 0); 97b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%#12x", 0); 98b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%#012x", 0); 99b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0x1", "%#x", 1); 100b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0x1", "%#12x", 1); 101b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0x0000000001", "%#012x", 1); 102b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0x7fffffff", "%#x", INT_MAX); 103b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX); 104b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX); 105b9385720SDag-Erling Smørgrav } 106b9385720SDag-Erling Smørgrav 107b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_X); 108b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_X, tc) 109b9385720SDag-Erling Smørgrav { 110b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%X", 0); 111b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%12X", 0); 112b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%012X", 0); 113b9385720SDag-Erling Smørgrav SNPRINTF_TEST("1", "%X", 1); 114b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 1", "%12X", 1); 115b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000001", "%012X", 1); 116b9385720SDag-Erling Smørgrav SNPRINTF_TEST("7FFFFFFF", "%X", INT_MAX); 117b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX); 118b9385720SDag-Erling Smørgrav SNPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX); 119b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0", "%#X", 0); 120b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0", "%#12X", 0); 121b9385720SDag-Erling Smørgrav SNPRINTF_TEST("000000000000", "%#012X", 0); 122b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0X1", "%#X", 1); 123b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0X1", "%#12X", 1); 124b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0X0000000001", "%#012X", 1); 125b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX); 126b9385720SDag-Erling Smørgrav SNPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX); 127b9385720SDag-Erling Smørgrav SNPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX); 128b9385720SDag-Erling Smørgrav } 129b9385720SDag-Erling Smørgrav 130b9385720SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp) 131b9385720SDag-Erling Smørgrav { 132b9385720SDag-Erling Smørgrav setlocale(LC_NUMERIC, "en_US.UTF-8"); 133b9385720SDag-Erling Smørgrav ATF_TP_ADD_TC(tp, snprintf_b); 134b9385720SDag-Erling Smørgrav ATF_TP_ADD_TC(tp, snprintf_B); 135b9385720SDag-Erling Smørgrav ATF_TP_ADD_TC(tp, snprintf_d); 136b9385720SDag-Erling Smørgrav ATF_TP_ADD_TC(tp, snprintf_x); 137b9385720SDag-Erling Smørgrav ATF_TP_ADD_TC(tp, snprintf_X); 138b9385720SDag-Erling Smørgrav return (atf_no_error()); 139b9385720SDag-Erling Smørgrav } 140