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:
parent
24c2d7ce87
commit
be95bee9b8
4 changed files with 20 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue