From 76642c9bfc653c971258bfbc8c92bc49a9630abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Wed, 17 May 2023 19:35:19 -0700 Subject: [PATCH] Fixed issue #266. --- src/string.cpp | 9 ++++----- tests/vsnprintf_test.cpp | 29 ++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/string.cpp b/src/string.cpp index acfa8c7..fc165fd 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -1207,15 +1207,14 @@ namespace bx int32_t size = write(&writer, _format, argListCopy, &err); va_end(argListCopy); + size += write(&writer, '\0', &err); + if (err.isOk() ) { - size += write(&writer, '\0', &err); return size - 1 /* size without '\0' terminator */; } - else - { - _out[_max-1] = '\0'; - } + + _out[_max-1] = '\0'; } Error err; diff --git a/tests/vsnprintf_test.cpp b/tests/vsnprintf_test.cpp index e358bc7..2a89f23 100644 --- a/tests/vsnprintf_test.cpp +++ b/tests/vsnprintf_test.cpp @@ -19,13 +19,32 @@ TEST_CASE("vsnprintf NULL buffer", "No output buffer provided.") TEST_CASE("vsnprintf truncated", "Truncated output buffer.") { - char buffer5[5]; // fit - REQUIRE(4 == bx::snprintf(buffer5, BX_COUNTOF(buffer5), "abvg") ); - REQUIRE(0 == bx::strCmp(buffer5, "abvg") ); + REQUIRE(4 == bx::snprintf(NULL, 0, "abvg") ); + + char buffer15[15]; // fit + REQUIRE(4 == bx::snprintf(buffer15, BX_COUNTOF(buffer15), "abvg") ); + REQUIRE('\0' == buffer15[4]); + REQUIRE(0 == bx::strCmp(buffer15, "abvg") ); + + char buffer1[1]; // truncate + REQUIRE(4 == bx::snprintf(buffer1, BX_COUNTOF(buffer1), "abvg") ); + REQUIRE('\0' == buffer1[BX_COUNTOF(buffer1)-1]); char buffer7[7]; // truncate - REQUIRE(10 == bx::snprintf(buffer7, BX_COUNTOF(buffer7), "Ten chars!") ); - REQUIRE(0 == bx::strCmp(buffer7, "Ten ch") ); + REQUIRE(10 == bx::snprintf(NULL, 0, "Ten chars!") ); + REQUIRE(10 == bx::snprintf(buffer7, BX_COUNTOF(buffer7), "Ten chars!") ); + REQUIRE('\0' == buffer7[BX_COUNTOF(buffer7)-1]); + REQUIRE(0 == bx::strCmp(buffer7, "Ten ch") ); + + REQUIRE(7 == bx::snprintf(NULL, 0, "Seven67") ); + REQUIRE(7 == bx::snprintf(buffer7, BX_COUNTOF(buffer7), "Seven67") ); + REQUIRE('\0' == buffer7[BX_COUNTOF(buffer7)-1]); + REQUIRE(0 == bx::strCmp(buffer7, "Seven6") ); + + REQUIRE(11 == bx::snprintf(NULL, 0, "SevenEleven") ); + REQUIRE(11 == bx::snprintf(buffer7, BX_COUNTOF(buffer7), "SevenEleven") ); + REQUIRE('\0' == buffer7[BX_COUNTOF(buffer7)-1]); + REQUIRE(0 == bx::strCmp(buffer7, "SevenE") ); } static bool test(const char* _expected, const char* _format, ...)