Branimir Karadžić 9 years ago
parent
commit
9627eefda6
2 changed files with 52 additions and 9 deletions
  1. 31 8
      src/crt.cpp
  2. 21 1
      tests/vsnprintf_test.cpp

+ 31 - 8
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;
 

+ 21 - 1
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") );
 }