diff options
| author | Richard M. Stallman | 1998-02-02 01:08:52 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1998-02-02 01:08:52 +0000 |
| commit | eb659c4114db8acca4632859bae2cae07c6c6e46 (patch) | |
| tree | a4d5fdc6bc9782a2e4e608fa551913890b12ad97 /src | |
| parent | 6a7df83b34b52efc1e40e6854e4368f76afcc7d1 (diff) | |
| download | emacs-eb659c4114db8acca4632859bae2cae07c6c6e46.tar.gz emacs-eb659c4114db8acca4632859bae2cae07c6c6e46.zip | |
(read1): Handle infinities, NaN and -0.0 specially.
(isfloat_string): Accept e+INF and e+NAN as exponents.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lread.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/lread.c b/src/lread.c index ef46e5f6a34..ec72ded41ba 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -1907,7 +1907,23 @@ read1 (readcharfun, pch, first_in_list) | |||
| 1907 | } | 1907 | } |
| 1908 | #ifdef LISP_FLOAT_TYPE | 1908 | #ifdef LISP_FLOAT_TYPE |
| 1909 | if (isfloat_string (read_buffer)) | 1909 | if (isfloat_string (read_buffer)) |
| 1910 | return make_float (atof (read_buffer)); | 1910 | { |
| 1911 | double value = atof (read_buffer); | ||
| 1912 | if (read_buffer[0] == '-' && value == 0.0) | ||
| 1913 | value *= -1.0; | ||
| 1914 | /* The only way this can be true, after isfloat_string | ||
| 1915 | returns 1, is if the input ends in e+INF or e+NaN. */ | ||
| 1916 | if (p[-1] == 'F' || p[-1] == 'N') | ||
| 1917 | { | ||
| 1918 | if (p[-1] == 'N') | ||
| 1919 | value = 0.0 / 0.0; | ||
| 1920 | else if (read_buffer[0] == '-') | ||
| 1921 | value = -1.0e999; | ||
| 1922 | else | ||
| 1923 | value = 1.0e999; | ||
| 1924 | } | ||
| 1925 | return make_float (value); | ||
| 1926 | } | ||
| 1911 | #endif | 1927 | #endif |
| 1912 | } | 1928 | } |
| 1913 | 1929 | ||
| @@ -1968,6 +1984,17 @@ isfloat_string (cp) | |||
| 1968 | while (*cp >= '0' && *cp <= '9') | 1984 | while (*cp >= '0' && *cp <= '9') |
| 1969 | cp++; | 1985 | cp++; |
| 1970 | } | 1986 | } |
| 1987 | else if (cp[-1] == '+' && cp[0] == 'I' && cp[1] == 'N' && cp[2] == 'F') | ||
| 1988 | { | ||
| 1989 | state |= EXP_INT; | ||
| 1990 | cp += 3; | ||
| 1991 | } | ||
| 1992 | else if (cp[-1] == '+' && cp[0] == 'N' && cp[1] == 'a' && cp[2] == 'N') | ||
| 1993 | { | ||
| 1994 | state |= EXP_INT; | ||
| 1995 | cp += 3; | ||
| 1996 | } | ||
| 1997 | |||
| 1971 | return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f')) | 1998 | return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f')) |
| 1972 | && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT) | 1999 | && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT) |
| 1973 | || state == (DOT_CHAR|TRAIL_INT) | 2000 | || state == (DOT_CHAR|TRAIL_INT) |