diff --git a/src/crt.cpp b/src/crt.cpp index 8686f03..eed96ee 100644 --- a/src/crt.cpp +++ b/src/crt.cpp @@ -115,11 +115,22 @@ namespace bx { struct Param { + Param() + : width(0) + , base(10) + , prec(6) + , fill(' ') + , left(false) + , upper(false) + { + } + int32_t width; uint32_t base; uint32_t prec; char fill; bool left; + bool upper; }; static int32_t write(WriterI* _writer, const char* _str, int32_t _len, const Param& _param, Error* _err) @@ -133,7 +144,17 @@ namespace bx size += writeRep(_writer, _param.fill, padding, _err); } - size += write(_writer, _str, len, _err); + if (_param.upper) + { + for (int32_t ii = 0; ii < len; ++ii) + { + size += write(_writer, toUpper(_str[ii]), _err); + } + } + else + { + size += write(_writer, _str, len, _err); + } if (_param.left) { @@ -143,6 +164,11 @@ namespace bx return size; } + static int32_t write(WriterI* _writer, char _ch, const Param& _param, Error* _err) + { + return write(_writer, &_ch, 1, _param, _err); + } + static int32_t write(WriterI* _writer, const char* _str, const Param& _param, Error* _err) { return write(_writer, _str, INT32_MAX, _param, _err); @@ -235,11 +261,6 @@ namespace bx read(&reader, ch); Param param; - param.base = 10; - param.prec = 6; - param.left = false; - param.fill = ' '; - param.width = 0; while (' ' == ch || '-' == ch @@ -304,13 +325,14 @@ namespace bx switch (toLower(ch) ) { case 'c': - size += write(_writer, char(va_arg(_argList, int32_t) ), _err); + size += write(_writer, char(va_arg(_argList, int32_t) ), param, _err); break; case 's': size += write(_writer, va_arg(_argList, const char*), param, _err); break; + case 'i': case 'd': param.base = 10; size += write(_writer, va_arg(_argList, int32_t), param, _err); @@ -325,7 +347,8 @@ namespace bx break; case 'x': - param.base = 16; + param.base = 16; + param.upper = isUpper(ch); size += write(_writer, va_arg(_argList, uint32_t), param, _err); break; diff --git a/tests/vsnprintf_test.cpp b/tests/vsnprintf_test.cpp index 45b748b..bb9f113 100644 --- a/tests/vsnprintf_test.cpp +++ b/tests/vsnprintf_test.cpp @@ -53,16 +53,36 @@ TEST_CASE("vsnprintf f", "") REQUIRE(test("13.370 ", "%*.*f", -8, 3, 13.37) ); } -TEST_CASE("vsnprintf d/u/x", "") +TEST_CASE("vsnprintf d/i/u/x", "") { REQUIRE(test("1337", "%d", 1337) ); + REQUIRE(test("1337 ", "%-20d", 1337) ); + REQUIRE(test("-1337 ", "%-20d", -1337) ); + + REQUIRE(test("1337", "%i", 1337) ); + REQUIRE(test("1337 ", "%-20i", 1337) ); + REQUIRE(test("-1337 ", "%-20i", -1337) ); + + REQUIRE(test("1337", "%u", 1337) ); + REQUIRE(test("1337 ", "%-20u", 1337u) ); + REQUIRE(test("4294965959 ", "%-20u", -1337u) ); REQUIRE(test("1337", "%x", 0x1337) ); + REQUIRE(test("1234abcd ", "%-20x", 0x1234abcdu) ); + REQUIRE(test("1234ABCD ", "%-20X", 0x1234abcdu) ); + REQUIRE(test("edcb5433 ", "%-20x", -0x1234abcdu) ); + REQUIRE(test("EDCB5433 ", "%-20X", -0x1234abcdu) ); + REQUIRE(test("0000000000001234abcd", "%020x", 0x1234abcdu) ); + REQUIRE(test("0000000000001234ABCD", "%020X", 0x1234abcdu) ); + REQUIRE(test("000000000000edcb5433", "%020x", -0x1234abcdu) ); + REQUIRE(test("000000000000EDCB5433", "%020X", -0x1234abcdu) ); } TEST_CASE("vsnprintf", "") { REQUIRE(test("x", "%c", 'x') ); + REQUIRE(test("x ", "%-20c", 'x') ); + REQUIRE(test("hello ", "%-20s", "hello") ); REQUIRE(test("hello, world!", "%s, %s!", "hello", "world") ); }