157 lines
5.4 KiB
C++
157 lines
5.4 KiB
C++
$NetBSD$
|
|
|
|
--- libraries/source/fcollada/src/FCollada/FUtils/FUStringBuilder.hpp.orig 2008-09-07 22:13:25.000000000 +0000
|
|
+++ libraries/source/fcollada/src/FCollada/FUtils/FUStringBuilder.hpp
|
|
@@ -26,62 +26,6 @@
|
|
#define SAFE_DELETE_ARRAY(ptr) if (ptr != NULL) { delete [] ptr; ptr = NULL; }
|
|
#endif
|
|
|
|
-template <class Char, class FloatType>
|
|
-void FloatToString(FloatType f, Char* sz)
|
|
-{
|
|
- Char* buffer = sz + 1;
|
|
- static const int digitCount = 6;
|
|
- int decimal, sign;
|
|
-
|
|
- // ecvt rounds the string for us: http://www.datafocus.com/docs/man3/ecvt.3.asp
|
|
- char* end = ecvt(f, digitCount, &decimal, &sign);
|
|
-
|
|
- if (sign != 0) (*buffer++) = '-';
|
|
- int count = digitCount;
|
|
- if (decimal > digitCount)
|
|
- {
|
|
- // We use the scientific notation: P.MeX
|
|
- (*buffer++) = (*end++); // P is one character.
|
|
- (*buffer++) = '.';
|
|
-
|
|
- // Mantissa (cleaned for zeroes)
|
|
- for (--count; count > 0; --count) if (end[count - 1] != '0') break;
|
|
- for (int i = 0; i < count; ++i) (*buffer++) = (*end++);
|
|
- if (buffer[-1] == '.') --buffer;
|
|
-
|
|
- // Exponent
|
|
- (*buffer++) = 'e';
|
|
- uint32 exponent = decimal - 1; // X
|
|
- if (exponent >= 10) (*buffer++) = (Char) ('0' + (exponent / 10));
|
|
- (*buffer++) = (Char) ('0' + (exponent % 10));
|
|
- (*buffer) = 0;
|
|
- return;
|
|
- }
|
|
- else if (decimal > 0)
|
|
- {
|
|
- // Simple number: A.B
|
|
- for (int i = 0; i < decimal; ++i) (*buffer++) = (*end++);
|
|
- if (decimal < digitCount) (*buffer++) = '.';
|
|
- count = digitCount - decimal;
|
|
- }
|
|
- else if (decimal < -digitCount)
|
|
- {
|
|
- // What case is this?
|
|
- decimal = count = 0;
|
|
- }
|
|
- else if (decimal < 0 || (decimal == 0 && *end != '0'))
|
|
- {
|
|
- // Tiny number: 0.Me-X
|
|
- (*buffer++) = '0'; (*buffer++) = '.';
|
|
- for (int i = 0; i < -decimal; ++i) (*buffer++) = '0';
|
|
- count = digitCount + decimal;
|
|
- }
|
|
- for (; count > 0; --count) if (end[count - 1] != '0') break;
|
|
- for (int i = 0; i < count; ++i) (*buffer++) = (*end++);
|
|
- if (decimal == 0 && count == 0) (*buffer++) = '0';
|
|
- if (buffer[-1] == '.') --buffer;
|
|
- (*buffer) = 0;
|
|
-}
|
|
|
|
template <class Char>
|
|
FUStringBuilderT<Char>::FUStringBuilderT(const String& sz)
|
|
@@ -234,53 +178,46 @@ void FUStringBuilderT<Char>::append(cons
|
|
template <class Char>
|
|
void FUStringBuilderT<Char>::append(float f)
|
|
{
|
|
-#ifdef WIN32
|
|
- // use <float.h> _isnan method to detect the 1.#IND00 NaN.
|
|
- if (f != std::numeric_limits<float>::infinity() && f != -std::numeric_limits<float>::infinity() && f != std::numeric_limits<float>::quiet_NaN() && f != std::numeric_limits<float>::signaling_NaN() && !_isnan((double)f))
|
|
-#else
|
|
- if (f != std::numeric_limits<float>::infinity() && f != -std::numeric_limits<float>::infinity() && f != std::numeric_limits<float>::quiet_NaN() && f != std::numeric_limits<float>::signaling_NaN())
|
|
-#endif
|
|
- {
|
|
- if (IsEquivalent(f, 0.0f, std::numeric_limits<float>::epsilon())) append((Char)'0');
|
|
- else
|
|
- {
|
|
- Char sz[128];
|
|
- FloatToString(f, sz);
|
|
- append(sz + 1);
|
|
- }
|
|
- }
|
|
- else if (f == std::numeric_limits<float>::infinity())
|
|
- { append((Char)'I'); append((Char)'N'); append((Char)'F'); }
|
|
- else if (f == -std::numeric_limits<float>::infinity())
|
|
- { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); }
|
|
- else
|
|
- { append((Char)'N'); append((Char)'a'); append((Char)'N'); }
|
|
+ append((double)f);
|
|
}
|
|
|
|
template <class Char>
|
|
void FUStringBuilderT<Char>::append(double f)
|
|
{
|
|
-#ifdef WIN32
|
|
- // use <float.h> _isnan method to detect the .#IND00 NaN.
|
|
- if (f != std::numeric_limits<float>::infinity() && f != -std::numeric_limits<float>::infinity() && f != std::numeric_limits<float>::quiet_NaN() && f != std::numeric_limits<float>::signaling_NaN() && !_isnan(f))
|
|
-#else
|
|
- if (f != std::numeric_limits<float>::infinity() && f != -std::numeric_limits<float>::infinity() && f != std::numeric_limits<float>::quiet_NaN() && f != std::numeric_limits<float>::signaling_NaN())
|
|
-#endif
|
|
- {
|
|
- if (IsEquivalent(f, 0.0, std::numeric_limits<double>::epsilon())) append((Char)'0');
|
|
- else
|
|
- {
|
|
- Char sz[128];
|
|
- FloatToString(f, sz);
|
|
- append(sz + 1);
|
|
- }
|
|
- }
|
|
- else if (f == std::numeric_limits<double>::infinity())
|
|
- { append((Char)'I'); append((Char)'N'); append((Char)'F'); }
|
|
- else if (f == -std::numeric_limits<double>::infinity())
|
|
- { append((Char)'-'); append((Char)'I'); append((Char)'N'); append((Char)'F'); }
|
|
- else
|
|
- { append((Char)'N'); append((Char)'a'); append((Char)'N'); }
|
|
+ if (f == -std::numeric_limits<double>::infinity()) {
|
|
+ append("-INF");
|
|
+ return;
|
|
+ } else if (f == std::numeric_limits<double>::infinity()) {
|
|
+ append("INF");
|
|
+ return;
|
|
+ } else if (f != f) {
|
|
+ append("NaN");
|
|
+ return;
|
|
+ } else if (-std::numeric_limits<double>::epsilon() < f && f < std::numeric_limits<double>::epsilon()) {
|
|
+ append("0.0E0");
|
|
+ return;
|
|
+ }
|
|
+ if (f < 0.0) {
|
|
+ f = -f;
|
|
+ append('-');
|
|
+ }
|
|
+
|
|
+ int e = 0;
|
|
+ if (f < 1.0)
|
|
+ for (; f < 1.0; f *= 10.0)
|
|
+ e--;
|
|
+ else
|
|
+ for (; f >= 10.0; f /= 10.0)
|
|
+ e++;
|
|
+
|
|
+ char tmp[10];
|
|
+ sprintf(tmp, "%.6g", f);
|
|
+ append(tmp);
|
|
+ if (tmp[1] == 0) // only one digit, add missing part according canonical representation
|
|
+ append(".0");
|
|
+
|
|
+ sprintf(tmp, "E%d", e);
|
|
+ append(tmp);
|
|
}
|
|
|
|
template <class Char>
|