On 08/02/16 13:37, Iván Matellanes wrote:
+static istream* istream_internal_read_float(istream *this, void *p, int size) +{
- /* size: 0 => float, 1 => double, 2 => long double */
- const int max_chars[3] = {20, 28, 32}; /* character count is limited on Windows */
- char buffer[32];
- double d;
- TRACE("(%p %p %d)\n", this, p, size);
- if (istream_ipfx(this, 0)) {
if (istream_getdouble(this, buffer, max_chars[size]) > 0) {
d = strtod(buffer, NULL);
if (size == 0) {
/* check whether the value fits in the output var */
if (d > FLT_MAX)
d = FLT_MAX;
else if (d < -FLT_MAX)
d = -FLT_MAX;
else if (d > 0 && d < FLT_MIN)
d = FLT_MIN;
else if (d < 0 && d > -FLT_MIN)
d = -FLT_MIN;
*((float*) p) = d;
I think that this helper will be nicer if it has following prototype: static double istream_internal_read_float(istream *this, int max_chars); where max_chars is set to 20, 28 or 32 depending if float, double or LDOUBLE needs to be read. With FLT_MIN/FLT_MAX checks moved to operator>>(float) implementation.
Thanks, Piotr