Mercurial > projects > ldc
comparison dmd/lexer.c @ 696:48f462341528
Fix issues with gradual underflow and strtof, strtod on Mac.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Mon, 13 Oct 2008 14:01:18 +0200 |
parents | eef8ac26c66c |
children | 25a32766ed57 |
comparison
equal
deleted
inserted
replaced
695:a51fed3de34e | 696:48f462341528 |
---|---|
2423 t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble); | 2423 t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble); |
2424 #else | 2424 #else |
2425 t->float80value = strtold((char *)stringbuffer.data, NULL); | 2425 t->float80value = strtold((char *)stringbuffer.data, NULL); |
2426 #endif | 2426 #endif |
2427 errno = 0; | 2427 errno = 0; |
2428 float strtofres; | |
2429 double strtodres; | |
2428 switch (*p) | 2430 switch (*p) |
2429 { | 2431 { |
2430 case 'F': | 2432 case 'F': |
2431 case 'f': | 2433 case 'f': |
2432 #ifdef IN_GCC | 2434 #ifdef IN_GCC |
2433 real_t::parse((char *)stringbuffer.data, real_t::Float); | 2435 real_t::parse((char *)stringbuffer.data, real_t::Float); |
2434 #else | 2436 #else |
2435 strtof((char *)stringbuffer.data, NULL); | 2437 strtofres = strtof((char *)stringbuffer.data, NULL); |
2438 // LDC change: don't error on gradual underflow | |
2439 if (errno == ERANGE && | |
2440 strtofres != 0 && strtofres != HUGE_VALF && strtofres != -HUGE_VALF) | |
2441 errno = 0; | |
2436 #endif | 2442 #endif |
2437 result = TOKfloat32v; | 2443 result = TOKfloat32v; |
2438 p++; | 2444 p++; |
2439 break; | 2445 break; |
2440 | 2446 |
2441 default: | 2447 default: |
2442 #ifdef IN_GCC | 2448 #ifdef IN_GCC |
2443 real_t::parse((char *)stringbuffer.data, real_t::Double); | 2449 real_t::parse((char *)stringbuffer.data, real_t::Double); |
2444 #else | 2450 #else |
2445 strtod((char *)stringbuffer.data, NULL); | 2451 strtodres = strtod((char *)stringbuffer.data, NULL); |
2452 // LDC change: don't error on gradual underflow | |
2453 if (errno == ERANGE && | |
2454 strtodres != 0 && strtodres != HUGE_VAL && strtodres != -HUGE_VAL) | |
2455 errno = 0; | |
2446 #endif | 2456 #endif |
2447 result = TOKfloat64v; | 2457 result = TOKfloat64v; |
2448 break; | 2458 break; |
2449 | 2459 |
2450 case 'l': | 2460 case 'l': |