[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Inconsistency in `string-to-number'
From: |
Juanma Barranquero |
Subject: |
Re: Inconsistency in `string-to-number' |
Date: |
Fri, 4 Dec 2009 04:21:27 +0100 |
On Tue, Dec 1, 2009 at 21:15, Stefan Monnier <address@hidden> wrote:
> Sorry, your email got misfiled.
No problem.
>> 3) Allow any trailing char.
>> Pro: forgiving.
>> Cons: (unlikely) incompatibility with uses of undocumented "1.2:" => 1
>
> That would be my choice. The behavior is still fairly regular, so the
> doc shouldn't be too scary, and it works about as well as now.
OK.
> I'd need to see the patch to pronouce myself on the uncleanliness.
Attached.
Juanma
diff --git a/src/lisp.h b/src/lisp.h
index 2052dfa..3bdecc5 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -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));
diff --git a/src/lread.c b/src/lread.c
index 97b9410..f9b51a8 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -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)
diff --git a/src/data.c b/src/data.c
index ce2d842..0f47556 100644
--- a/src/data.c
+++ b/src/data.c
@@ -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
{