Commit be95bee9 authored by Juanma Barranquero's avatar Juanma Barranquero

Fix `string-to-number' to deal consistently with integers and floats.

* lread.c (isfloat_string): New argument ignore_trailing to accept all
  trailing characters, not just whitespace.
  (read1): Pass new arg 0 to keep old behavior.
* data.c (Fstring_to_number): Pass 1 to isfloat_string to ignore
  trailing chars, as it is already done for integers.  Doc fixes.
* lisp.h (isfloat_string): Add new arg to declaration of isfloat_string.
parent 24c2d7ce
2009-12-04 Juanma Barranquero <lekktu@gmail.com>
Fix `string-to-number' to deal consistently with integers and floats.
* lread.c (isfloat_string): New argument ignore_trailing to accept all
trailing characters, not just whitespace.
(read1): Pass new arg 0 to keep old behavior.
* data.c (Fstring_to_number): Pass 1 to isfloat_string to ignore
trailing chars, as it is already done for integers. Doc fixes.
* lisp.h (isfloat_string): Add new arg to declaration of isfloat_string.
2009-12-04 Eli Zaretskii <eliz@gnu.org>
* dispextern.h (enum prop_idx) <AUTO_COMPOSED_PROP_IDX>: Delete
......
......@@ -1770,7 +1770,7 @@ BUFFER defaults to the current buffer. */)
CHECK_SYMBOL (variable);
sym = indirect_variable (XSYMBOL (variable));
XSETSYMBOL (variable, sym);
valcontents = sym->value;
if (BUFFER_LOCAL_VALUEP (valcontents))
{
......@@ -2353,11 +2353,11 @@ digit_to_number (character, base)
DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
doc: /* Parse STRING as a decimal number and return the number.
This parses both integers and floating point numbers.
It ignores leading spaces and tabs.
It ignores leading spaces and tabs, and all trailing chars.
If BASE, interpret STRING as a number in that base. If BASE isn't
present, base 10 is used. BASE must be between 2 and 16 (inclusive).
If the base used is not 10, floating point is not recognized. */)
If the base used is not 10, STRING is always parsed as integer. */)
(string, base)
register Lisp_Object string, base;
{
......@@ -2392,7 +2392,7 @@ If the base used is not 10, floating point is not recognized. */)
else if (*p == '+')
p++;
if (isfloat_string (p) && b == 10)
if (isfloat_string (p, 1) && b == 10)
val = make_float (sign * atof (p));
else
{
......
......@@ -2795,7 +2795,7 @@ extern Lisp_Object Vcurrent_load_list;
extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes;
extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
Lisp_Object *, Lisp_Object));
extern int isfloat_string P_ ((char *));
extern int isfloat_string P_ ((char *, int));
extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
Lisp_Object));
extern void dir_warning P_ ((char *, Lisp_Object));
......
......@@ -3026,7 +3026,7 @@ read1 (readcharfun, pch, first_in_list)
}
}
}
if (isfloat_string (read_buffer))
if (isfloat_string (read_buffer, 0))
{
/* Compute NaN and infinities using 0.0 in a variable,
to cope with compilers that think they are smarter
......@@ -3244,8 +3244,9 @@ substitute_in_interval (interval, arg)
#define EXP_INT 16
int
isfloat_string (cp)
isfloat_string (cp, ignore_trailing)
register char *cp;
int ignore_trailing;
{
register int state;
......@@ -3299,7 +3300,8 @@ isfloat_string (cp)
cp += 3;
}
return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f'))
return ((ignore_trailing
|| (*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f'))
&& (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
|| state == (DOT_CHAR|TRAIL_INT)
|| state == (LEAD_INT|E_CHAR|EXP_INT)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment