Removed use of CRT vsnprintf.

This commit is contained in:
Branimir Karadžić
2018-11-12 20:01:26 -08:00
parent aee6ccace0
commit 7adf730694
8 changed files with 61 additions and 81 deletions

View File

@@ -356,43 +356,6 @@ namespace bx
return result;
}
inline int32_t writePrintfVargs(WriterI* _writer, const char* _format, va_list _argList)
{
va_list argListCopy;
va_copy(argListCopy, _argList);
char temp[2048];
char* out = temp;
int32_t max = sizeof(temp);
int32_t len = vsnprintf(out, max, _format, argListCopy);
va_end(argListCopy);
if (len > max)
{
va_copy(argListCopy, _argList);
out = (char*)alloca(len);
len = vsnprintf(out, len, _format, argListCopy);
va_end(argListCopy);
}
int32_t size = write(_writer, out, len);
return size;
}
inline int32_t writePrintf(WriterI* _writer, const char* _format, ...)
{
va_list argList;
va_start(argList, _format);
int32_t size = writePrintfVargs(_writer, _format, argList);
va_end(argList);
return size;
}
inline int64_t skip(SeekerI* _seeker, int64_t _offset)
{
return _seeker->seek(_offset, Whence::Current);

View File

@@ -262,13 +262,13 @@ namespace bx
/// Write string view.
int32_t write(WriterI* _writer, const StringView& _str, Error* _err = NULL);
///
/// Write formated string.
int32_t write(WriterI* _writer, const StringView& _format, va_list _argList, Error* _err);
///
/// Write formated string.
int32_t write(WriterI* _writer, Error* _err, const StringView* _format, ...);
///
/// Write formated string.
int32_t write(WriterI* _writer, Error* _err, const char* _format, ...);
/// Write repeat the same value.
@@ -286,12 +286,6 @@ namespace bx
template<typename Ty>
int32_t writeBE(WriterI* _writer, const Ty& _value, Error* _err = NULL);
/// Write formated string.
int32_t writePrintfVargs(WriterI* _writer, const char* _format, va_list _argList);
/// Write formated string.
int32_t writePrintf(WriterI* _writer, const char* _format, ...);
/// Skip _offset bytes forward.
int64_t skip(SeekerI* _seeker, int64_t _offset);

View File

@@ -304,7 +304,8 @@ extern "C" int printf(const char* _format, ...)
va_list argList;
va_start(argList, _format);
bx::WriterI* writer = bx::getStdOut();
int32_t len = bx::writePrintfVargs(writer, _format, argList);
bx::Error err;
int32_t len = bx::write(writer, &err, _format, argList);
va_end(argList);
return len;
}

View File

@@ -51,8 +51,8 @@ namespace bx
virtual int32_t write(const void* _data, int32_t _size, Error* _err) override
{
BX_UNUSED(_data, _size, _err);
return 0;
BX_UNUSED(_data, _err);
return _size;
}
};

View File

@@ -9,10 +9,6 @@
#include <bx/readerwriter.h>
#include <bx/string.h>
#if !BX_CRT_NONE
# include <stdio.h> // vsnprintf
#endif // !BX_CRT_NONE
namespace bx
{
inline bool isInRange(char _ch, char _from, char _to)
@@ -1124,7 +1120,7 @@ namespace bx
return total;
}
int32_t vsnprintfRef(char* _out, int32_t _max, const char* _format, va_list _argList)
int32_t vsnprintf(char* _out, int32_t _max, const char* _format, va_list _argList)
{
if (1 < _max)
{
@@ -1154,6 +1150,12 @@ namespace bx
return size;
}
#if 0
#if !BX_CRT_NONE
# include <stdio.h> // vsnprintf
#endif // !BX_CRT_NONE
int32_t vsnprintf(char* _out, int32_t _max, const char* _format, va_list _argList)
{
va_list argList;
@@ -1178,6 +1180,8 @@ namespace bx
return total;
}
#endif // 0
int32_t snprintf(char* _out, int32_t _max, const char* _format, ...)
{
va_list argList;

View File

@@ -11,24 +11,25 @@
TEST_CASE("easing", "")
{
bx::WriterI* writer = bx::getNullOut();
bx::Error err;
for (uint32_t ee = 0; ee < bx::Easing::Count; ++ee)
{
bx::writePrintf(writer, "\n\n%d\n", ee);
bx::write(writer, &err, "\n\n%d\n", ee);
const bx::EaseFn easing = bx::getEaseFunc(bx::Easing::Enum(ee) );
const int32_t nx = 64;
const int32_t ny = 10;
bx::writePrintf(writer, "\t/// ^\n");
bx::write(writer, &err, "\t/// ^\n");
for (int32_t yy = ny+4; yy >= -5; --yy)
{
const float ys = float(yy )/float(ny);
const float ye = float(yy+1.0)/float(ny);
bx::writePrintf(writer, "\t/// %c", yy != 0 ? '|' : '+');
bx::write(writer, &err, "\t/// %c", yy != 0 ? '|' : '+');
for (int32_t xx = 0; xx < nx; ++xx)
{
@@ -41,18 +42,18 @@ TEST_CASE("easing", "")
if (vv >= ys
&& vv < ye)
{
bx::writePrintf(writer, "*");
bx::write(writer, "*");
break;
}
}
if (jj == 10)
{
bx::writePrintf(writer, "%c", yy != 0 ? ' ' : '-');
bx::write(writer, &err, "%c", yy != 0 ? ' ' : '-');
}
}
bx::writePrintf(writer, "%s\n", yy != 0 ? "" : ">");
bx::write(writer, &err, "%s\n", yy != 0 ? "" : ">");
}
}
}

View File

@@ -55,84 +55,98 @@ TEST_CASE("libm", "")
REQUIRE(bx::equal( 0.89f, bx::fract( 13.89f), 0.000001f) );
REQUIRE(bx::equal(-0.89f, bx::fract(-13.89f), 0.000001f) );
bx::Error err;
for (int32_t yy = -10; yy < 10; ++yy)
{
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "ldexp(%f, %d) == %f (expected: %f)\n", xx, yy, bx::ldexp(xx, yy), ::ldexpf(xx, yy) );
bx::write(writer, &err, "ldexp(%f, %d) == %f (expected: %f)\n", xx, yy, bx::ldexp(xx, yy), ::ldexpf(xx, yy) );
REQUIRE(bx::equal(bx::ldexp(xx, yy), ::ldexpf(xx, yy), 0.00001f) );
}
}
for (float xx = -80.0f; xx < 80.0f; xx += 0.1f)
{
bx::writePrintf(writer, "exp(%f) == %f (expected: %f)\n", xx, bx::exp(xx), ::expf(xx) );
bx::write(writer, &err, "exp(%f) == %f (expected: %f)\n", xx, bx::exp(xx), ::expf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::exp(xx), ::expf(xx), 0.00001f) );
}
for (float xx = 0.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "rsqrt(%f) == %f (expected: %f)\n", xx, bx::rsqrt(xx), 1.0f/::sqrtf(xx) );
bx::write(writer, &err, "rsqrt(%f) == %f (expected: %f)\n", xx, bx::rsqrt(xx), 1.0f/::sqrtf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::rsqrt(xx), 1.0f/::sqrtf(xx), 0.00001f) );
}
for (float xx = 0.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "sqrt(%f) == %f (expected: %f)\n", xx, bx::sqrt(xx), ::sqrtf(xx) );
bx::write(writer, &err, "sqrt(%f) == %f (expected: %f)\n", xx, bx::sqrt(xx), ::sqrtf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::sqrt(xx), ::sqrtf(xx), 0.00001f) );
}
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "pow(1.389f, %f) == %f (expected: %f)\n", xx, bx::pow(1.389f, xx), ::powf(1.389f, xx) );
bx::write(writer, &err, "pow(1.389f, %f) == %f (expected: %f)\n", xx, bx::pow(1.389f, xx), ::powf(1.389f, xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::pow(1.389f, xx), ::powf(1.389f, xx), 0.00001f) );
}
for (float xx = -1.0f; xx < 1.0f; xx += 0.001f)
{
bx::writePrintf(writer, "asin(%f) == %f (expected: %f)\n", xx, bx::asin(xx), ::asinf(xx) );
bx::write(writer, &err, "asin(%f) == %f (expected: %f)\n", xx, bx::asin(xx), ::asinf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::asin(xx), ::asinf(xx), 0.0001f) );
}
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "sin(%f) == %f (expected: %f)\n", xx, bx::sin(xx), ::sinf(xx) );
bx::write(writer, &err, "sin(%f) == %f (expected: %f)\n", xx, bx::sin(xx), ::sinf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::sin(xx), ::sinf(xx), 0.00001f) );
}
for (float xx = -1.0f; xx < 1.0f; xx += 0.1f)
{
bx::writePrintf(writer, "sinh(%f) == %f (expected: %f)\n", xx, bx::sinh(xx), ::sinhf(xx) );
bx::write(writer, &err, "sinh(%f) == %f (expected: %f)\n", xx, bx::sinh(xx), ::sinhf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::sinh(xx), ::sinhf(xx), 0.00001f) );
}
for (float xx = -1.0f; xx < 1.0f; xx += 0.001f)
{
bx::writePrintf(writer, "acos(%f) == %f (expected: %f\n)", xx, bx::acos(xx), ::acosf(xx) );
bx::write(writer, &err, "acos(%f) == %f (expected: %f\n)", xx, bx::acos(xx), ::acosf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::acos(xx), ::acosf(xx), 0.0001f) );
}
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "cos(%f) == %f (expected: %f)\n", xx, bx::cos(xx), ::cosf(xx) );
bx::write(writer, &err, "cos(%f) == %f (expected: %f)\n", xx, bx::cos(xx), ::cosf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::cos(xx), ::cosf(xx), 0.00001f) );
}
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "tan(%f) == %f (expected: %f)\n", xx, bx::tan(xx), ::tanf(xx) );
bx::write(writer, &err, "tan(%f) == %f (expected: %f)\n", xx, bx::tan(xx), ::tanf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::tan(xx), ::tanf(xx), 0.001f) );
}
for (float xx = -1.0f; xx < 1.0f; xx += 0.1f)
{
bx::writePrintf(writer, "tanh(%f) == %f (expected: %f\n", xx, bx::tanh(xx), ::tanhf(xx) );
bx::write(writer, &err, "tanh(%f) == %f (expected: %f\n", xx, bx::tanh(xx), ::tanhf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::tanh(xx), ::tanhf(xx), 0.00001f) );
}
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "atan(%f) == %f (expected: %f)\n", xx, bx::atan(xx), ::atanf(xx) );
bx::write(writer, &err, "atan(%f) == %f (expected: %f)\n", xx, bx::atan(xx), ::atanf(xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::atan(xx), ::atanf(xx), 0.00001f) );
}
@@ -140,7 +154,8 @@ TEST_CASE("libm", "")
{
for (float xx = -100.0f; xx < 100.0f; xx += 0.1f)
{
bx::writePrintf(writer, "atan2(%f, %f) == %f (expected: %f)\n", yy, xx, bx::atan2(yy, xx), ::atan2f(yy, xx) );
bx::write(writer, &err, "atan2(%f, %f) == %f (expected: %f)\n", yy, xx, bx::atan2(yy, xx), ::atan2f(yy, xx) );
REQUIRE(err.isOk() );
REQUIRE(bx::equal(bx::atan2(yy, xx), ::atan2f(yy, xx), 0.00001f) );
}
}

View File

@@ -41,38 +41,40 @@ void testRng(const char* _name, Ty* _rng)
}
bx::WriterI* writer = bx::getNullOut();
bx::writePrintf(writer, "%s\n", _name);
bx::Error err;
bx::write(writer, &err, "%s\n", _name);
{
bx::writePrintf(writer, "\tbits histogram:\n");
bx::write(writer, &err, "\tbits histogram:\n");
uint32_t min = UINT32_MAX;
uint32_t max = 0;
for (uint32_t ii = 0; ii < BX_COUNTOF(histBits); ++ii)
{
bx::writePrintf(writer, "\t\t%3d: %d\n", ii, histBits[ii]);
bx::write(writer, &err, "\t\t%3d: %d\n", ii, histBits[ii]);
min = bx::min(min, histBits[ii]);
max = bx::max(max, histBits[ii]);
}
bx::writePrintf(writer, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min);
bx::write(writer, &err, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min);
REQUIRE(max-min < 8000);
}
{
bx::writePrintf(writer, "\tuint8_t histogram:\n");
bx::write(writer, &err, "\tuint8_t histogram:\n");
uint32_t min = UINT32_MAX;
uint32_t max = 0;
for (uint32_t ii = 0; ii < BX_COUNTOF(histUint8); ++ii)
{
bx::writePrintf(writer, "\t\t%3d: %d\n", ii, histUint8[ii]);
bx::write(writer, &err, "\t\t%3d: %d\n", ii, histUint8[ii]);
min = bx::min(min, histUint8[ii]);
max = bx::max(max, histUint8[ii]);
}
bx::writePrintf(writer, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min);
bx::write(writer, &err, "\tmin: %d, max: %d (diff: %d)\n", min, max, max-min);
REQUIRE(max-min < 8000);
}