5 #ifndef __FAST_ATOF_H_INCLUDED__
6 #define __FAST_ATOF_H_INCLUDED__
20 #define IRR_ATOF_TABLE_SIZE 17
50 inline std::uint32_t
strtoul10(
const char* in,
const char** out= 0)
60 std::uint32_t unsignedValue = 0;
61 while ((*in >=
'0') && (*in <=
'9'))
63 const std::uint32_t tmp = (unsignedValue * 10) + (*in -
'0');
64 if (tmp<unsignedValue)
66 unsignedValue=(std::uint32_t)0xffffffff;
90 inline std::int32_t
strtol10(
const char* in,
const char** out= 0)
99 const bool negative = (
'-' == *in);
100 if (negative || (
'+' == *in))
103 const std::uint32_t unsignedValue =
strtoul10(in,out);
104 if (unsignedValue > (std::uint32_t)INT_MAX)
107 return (std::int32_t)INT_MIN;
109 return (std::int32_t)INT_MAX;
114 return -((std::int32_t)unsignedValue);
116 return (std::int32_t)unsignedValue;
128 if (in >=
'0' && in <=
'9')
130 else if (in >=
'a' && in <=
'f')
131 return 10u + in -
'a';
132 else if (in >=
'A' && in <=
'F')
133 return 10u + in -
'A';
147 inline std::uint32_t
strtoul16(
const char* in,
const char** out= 0)
157 std::uint32_t unsignedValue = 0;
160 std::uint32_t tmp = 0;
161 if ((*in >=
'0') && (*in <=
'9'))
162 tmp = (unsignedValue << 4u) + (*in -
'0');
163 else if ((*in >=
'A') && (*in <=
'F'))
164 tmp = (unsignedValue << 4u) + (*in -
'A') + 10;
165 else if ((*in >=
'a') && (*in <=
'f'))
166 tmp = (unsignedValue << 4u) + (*in -
'a') + 10;
169 if (tmp<unsignedValue)
171 unsignedValue=(std::uint32_t)INT_MAX;
182 return unsignedValue;
194 inline std::uint32_t
strtoul8(
const char* in,
const char** out= 0)
204 std::uint32_t unsignedValue = 0;
207 std::uint32_t tmp = 0;
208 if ((*in >=
'0') && (*in <=
'7'))
209 tmp = (unsignedValue << 3u) + (*in -
'0');
212 if (tmp<unsignedValue)
214 unsignedValue=(std::uint32_t)INT_MAX;
225 return unsignedValue;
259 inline float strtof10(
const char* in,
const char** out = 0)
268 const std::uint32_t MAX_SAFE_U32_VALUE = UINT_MAX / 10 - 10;
269 std::uint32_t intValue = 0;
273 while ((*in >=
'0') && (*in <=
'9'))
277 if (intValue >= MAX_SAFE_U32_VALUE)
280 intValue = (intValue * 10) + (*in -
'0');
284 float floatValue = (float)intValue;
288 while ((*in >=
'0') && (*in <=
'9'))
290 floatValue = (floatValue * 10.f) + (
float)(*in -
'0');
292 if (floatValue > FLT_MAX)
318 const bool negative = (
'-' == *in);
319 if (negative || (
'+'==*in))
324 const char* afterDecimal = ++in;
325 float decimal =
strtof10(in, &afterDecimal);
326 size_t numDecimals = afterDecimal - in;
333 value += decimal * (float)pow(10.f, -(
float)numDecimals);
337 if (
'e' == *in ||
'E' == *in)
344 value *= (float)pow(10.f, (
float)
strtol10(in, &in));
347 result = negative?-value:value;
357 inline float fast_atof(
const char* floatAsString,
const char** out= 0)