#include #include int main(void) { char buf[256]; int count; // Length modifiers. snprintf(buf, sizeof(buf), "%hhd %hd %d %ld %lld %jd %zd %td", (signed char)-5, (short)-1000, -12345, -1234567890L, (long long)-1234567890123LL, (long long)42LL, (unsigned long)1024UL, (int)64); *(volatile uint16_t *)0x025000UL = (uint16_t)snprintf(buf, sizeof(buf), "<%5d>", 42); // Width via '*'. *(volatile uint16_t *)0x025002UL = (uint16_t)snprintf(buf, sizeof(buf), "<%*d>", 5, 7); // Precision via '*'. *(volatile uint16_t *)0x025004UL = (uint16_t)snprintf(buf, sizeof(buf), "<%.*s>", 3, "abcdefg"); // Zero pad + sign. *(volatile uint16_t *)0x025006UL = (uint16_t)snprintf(buf, sizeof(buf), "%+08d", 42); // %n: write count so far through a pointer arg. snprintf(buf, sizeof(buf), "abc%n", &count); *(volatile uint16_t *)0x025008UL = (uint16_t)count; // %lld (long long). int len = snprintf(buf, sizeof(buf), "%lld", (long long)0x123456789LL); *(volatile uint16_t *)0x02500AUL = (uint16_t)len; // %zu (size_t). snprintf(buf, sizeof(buf), "%zu", (unsigned long)4096UL); // Hash-based check: read back the first uint16 of the formatted buf. *(volatile uint16_t *)0x02500CUL = *(uint16_t *)buf; // "40" // Octal. snprintf(buf, sizeof(buf), "%o", 0644); *(volatile uint16_t *)0x02500EUL = *(uint16_t *)buf; // "64" return 0; }