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.
This commit is contained in:
Juanma Barranquero 2009-12-04 16:16:26 +00:00
parent 24c2d7ce87
commit be95bee9b8
4 changed files with 20 additions and 8 deletions

View file

@ -1,3 +1,13 @@
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

View file

@ -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
{

View file

@ -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));

View file

@ -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)