From be95bee9b8cf3f771fdb6438a44ded2880e65617 Mon Sep 17 00:00:00 2001 From: Juanma Barranquero Date: Fri, 4 Dec 2009 16:16:26 +0000 Subject: [PATCH] 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. --- src/ChangeLog | 10 ++++++++++ src/data.c | 8 ++++---- src/lisp.h | 2 +- src/lread.c | 8 +++++--- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 3ee60381fe8..35100e126a3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2009-12-04 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. + 2009-12-04 Eli Zaretskii * dispextern.h (enum prop_idx) : Delete diff --git a/src/data.c b/src/data.c index ce2d842de44..0f47556fe45 100644 --- a/src/data.c +++ b/src/data.c @@ -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 { diff --git a/src/lisp.h b/src/lisp.h index 2052dfa0afc..3bdecc51033 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 97b9410b038..0649c638d98 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) -- 2.39.5