# HG changeset patch # User Richard M. Stallman # Date 886381732 0 # Node ID d5ae7491d2b0114be109e101685ba55379f9bd3d # Parent 8f6d92b4f48ae43e6e3fa19d1f193bda532e94db (read1): Handle infinities, NaN and -0.0 specially. (isfloat_string): Accept e+INF and e+NAN as exponents. diff -r 8f6d92b4f48a -r d5ae7491d2b0 src/lread.c --- a/src/lread.c Mon Feb 02 01:06:29 1998 +0000 +++ b/src/lread.c Mon Feb 02 01:08:52 1998 +0000 @@ -1907,7 +1907,23 @@ } #ifdef LISP_FLOAT_TYPE if (isfloat_string (read_buffer)) - return make_float (atof (read_buffer)); + { + double value = atof (read_buffer); + if (read_buffer[0] == '-' && value == 0.0) + value *= -1.0; + /* The only way this can be true, after isfloat_string + returns 1, is if the input ends in e+INF or e+NaN. */ + if (p[-1] == 'F' || p[-1] == 'N') + { + if (p[-1] == 'N') + value = 0.0 / 0.0; + else if (read_buffer[0] == '-') + value = -1.0e999; + else + value = 1.0e999; + } + return make_float (value); + } #endif } @@ -1968,6 +1984,17 @@ while (*cp >= '0' && *cp <= '9') cp++; } + else if (cp[-1] == '+' && cp[0] == 'I' && cp[1] == 'N' && cp[2] == 'F') + { + state |= EXP_INT; + cp += 3; + } + else if (cp[-1] == '+' && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N') + { + state |= EXP_INT; + cp += 3; + } + return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f')) && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT) || state == (DOT_CHAR|TRAIL_INT)