1
0
Fork 0

fix(printf): fix snprintf buffer termination

Fixes #7 (partly)
development
Marco Paland 7 years ago
parent dd8432003c
commit d74ad73009

@ -355,13 +355,13 @@ static size_t _vsnprintf(char* buffer, size_t buffer_len, const char* format, va
unsigned int flags, width, precision, n;
size_t idx = 0U;
while (idx < buffer_len) {
// end reached?
if (*format == (char)0) {
buffer[idx] = (char)0;
break;
}
// check if buffer is valid
if (!buffer) {
return 0U;
}
while ((idx < buffer_len) && *format)
{
// format specifier? %[flags][width][.precision][length]
if (*format != '%') {
// no
@ -582,9 +582,16 @@ static size_t _vsnprintf(char* buffer, size_t buffer_len, const char* format, va
}
}
// termination
if (buffer_len > 0U) {
buffer[idx == buffer_len ? buffer_len - 1U : idx] = (char)0;
}
// return written chars without terminating \0
return idx;
}
///////////////////////////////////////////////////////////////////////////////
int printf(const char* format, ...)

@ -1017,6 +1017,59 @@ TEST_CASE("unknown flag", "[]" ) {
}
TEST_CASE("buffer length", "[]" ) {
char buffer[100];
int ret;
// formatted length, this should return '4',
// but this feature is not implemented, returning 0
ret = test::snprintf(nullptr, 10, "%s", "Test");
REQUIRE(ret == 0);
ret = test::snprintf(nullptr, 0, "%s", "Test");
REQUIRE(ret == 0);
buffer[0] = (char)0xA5;
ret = test::snprintf(buffer, 0, "%s", "Test");
REQUIRE(buffer[0] == (char)0xA5);
REQUIRE(ret == 0);
buffer[0] = 0xCC;
test::snprintf(buffer, 1, "%s", "Test");
REQUIRE(buffer[0] == '\0');
test::snprintf(buffer, 2, "%s", "Hello");
REQUIRE(!strcmp(buffer, "H"));
}
TEST_CASE("ret value", "[]" ) {
char buffer[100] ;
int ret;
ret = test::snprintf(buffer, 6, "0%s", "1234");
REQUIRE(!strcmp(buffer, "01234"));
REQUIRE(ret == 5);
ret = test::snprintf(buffer, 6, "0%s", "12345");
REQUIRE(!strcmp(buffer, "01234"));
REQUIRE(ret == 6); // '5' is truncated
ret = test::snprintf(buffer, 6, "0%s", "1234567");
REQUIRE(!strcmp(buffer, "01234"));
REQUIRE(ret == 6); // '567' are truncated
ret = test::snprintf(buffer, 10, "hello, world");
REQUIRE(ret == 10);
ret = test::snprintf(buffer, 3, "%d", 10000);
REQUIRE(ret == 3); // '000' are truncated
REQUIRE(strlen(buffer) == 2U);
REQUIRE(buffer[0] == '1');
REQUIRE(buffer[1] == '0');
REQUIRE(buffer[2] == '\0');
}
TEST_CASE("misc", "[]" ) {
char buffer[100];

Loading…
Cancel
Save