vsnprintf: Added more unit tests.

This commit is contained in:
Branimir Karadžić
2017-02-12 20:04:19 -08:00
parent 5da8a80a1f
commit 71cc735785
6 changed files with 79 additions and 30 deletions

View File

@@ -286,22 +286,30 @@ namespace bx
return 0;
}
const char* dot = strnchr(str, '.');
const int32_t precLen = int32_t(
dot
+ uint32_min(_param.prec + _param.spec, 1)
+ _param.prec
- str
);
if (precLen > len)
if (_param.upper)
{
for (int32_t ii = len; ii < precLen; ++ii)
{
str[ii] = '0';
}
str[precLen] = '\0';
toUpper(str, len);
}
const char* dot = strnchr(str, '.');
if (NULL != dot)
{
const int32_t precLen = int32_t(
dot
+ uint32_min(_param.prec + _param.spec, 1)
+ _param.prec
- str
);
if (precLen > len)
{
for (int32_t ii = len; ii < precLen; ++ii)
{
str[ii] = '0';
}
str[precLen] = '\0';
}
len = precLen;
}
len = precLen;
return write(_writer, str, len, _param, _err);
}
@@ -440,9 +448,15 @@ namespace bx
{
case 'h': param.bits = sizeof(signed char )*8; break;
case 'l': param.bits = sizeof(long long int)*8; break;
case '3':
case '6':
read(&reader, ch);
if ('4' == ch) { param.bits = sizeof(int64_t)*8; }
switch (ch)
{
case '2': param.bits = sizeof(int32_t)*8; break;
case '4': param.bits = sizeof(int64_t)*8; break;
default: break;
}
break;
default: seek(&reader, -1); break;
@@ -484,6 +498,7 @@ namespace bx
break;
case 'f':
param.upper = isUpper(ch);
size += write(_writer, va_arg(_argList, double), param, _err);
break;

View File

@@ -424,34 +424,34 @@ namespace bx
return length + 2 + exp;
}
int32_t toString(char* _dst, size_t _max, double value)
int32_t toString(char* _dst, size_t _max, double _value)
{
if (isNan(value) )
{
return (int32_t)strlncpy(_dst, _max, "NaN");
}
else if (isInfinite(value) )
{
return (int32_t)strlncpy(_dst, _max, "Inf");
}
int32_t sign = 0.0 > value ? 1 : 0;
int32_t sign = 0 != (doubleToBits(_value) & (UINT64_C(1)<<63) ) ? 1 : 0;
if (1 == sign)
{
*_dst++ = '-';
--_max;
value = -value;
_value = -_value;
}
if (isNan(_value) )
{
return (int32_t)strlncpy(_dst, _max, "nan") + sign;
}
else if (isInfinite(_value) )
{
return (int32_t)strlncpy(_dst, _max, "inf") + sign;
}
int32_t len;
if (0.0 == value)
if (0.0 == _value)
{
len = (int32_t)strlncpy(_dst, _max, "0.0");
}
else
{
int32_t kk;
Grisu2(value, _dst, &len, &kk);
Grisu2(_value, _dst, &len, &kk);
len = Prettify(_dst, len, kk);
}

View File

@@ -60,11 +60,31 @@ namespace bx
return _ch + (isUpper(_ch) ? 0x20 : 0);
}
void toLower(char* _inOutStr, size_t _max)
{
size_t len = strnlen(_inOutStr, _max);
for (size_t ii = 0; ii < len; ++ii)
{
*_inOutStr = toLower(*_inOutStr);
}
}
char toUpper(char _ch)
{
return _ch - (isLower(_ch) ? 0x20 : 0);
}
void toUpper(char* _inOutStr, size_t _max)
{
size_t len = strnlen(_inOutStr, _max);
for (size_t ii = 0; ii < len; ++ii)
{
*_inOutStr = toUpper(*_inOutStr);
}
}
bool toBool(const char* _str)
{
char ch = toLower(_str[0]);