aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman1998-02-02 01:08:52 +0000
committerRichard M. Stallman1998-02-02 01:08:52 +0000
commiteb659c4114db8acca4632859bae2cae07c6c6e46 (patch)
treea4d5fdc6bc9782a2e4e608fa551913890b12ad97 /src
parent6a7df83b34b52efc1e40e6854e4368f76afcc7d1 (diff)
downloademacs-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.c29
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)