aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2009-12-04 16:16:26 +0000
committerJuanma Barranquero2009-12-04 16:16:26 +0000
commitbe95bee9b8cf3f771fdb6438a44ded2880e65617 (patch)
treefe4ccba69d57fbd4f7d72bcc0f37d24a3fd490a5
parent24c2d7ce87ac4e656d3c9c55b39f7b44d76e8f7a (diff)
downloademacs-be95bee9b8cf3f771fdb6438a44ded2880e65617.tar.gz
emacs-be95bee9b8cf3f771fdb6438a44ded2880e65617.zip
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.
-rw-r--r--src/ChangeLog10
-rw-r--r--src/data.c8
-rw-r--r--src/lisp.h2
-rw-r--r--src/lread.c8
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 @@
12009-12-04 Juanma Barranquero <lekktu@gmail.com>
2
3 Fix `string-to-number' to deal consistently with integers and floats.
4 * lread.c (isfloat_string): New argument ignore_trailing to accept all
5 trailing characters, not just whitespace.
6 (read1): Pass new arg 0 to keep old behavior.
7 * data.c (Fstring_to_number): Pass 1 to isfloat_string to ignore
8 trailing chars, as it is already done for integers. Doc fixes.
9 * lisp.h (isfloat_string): Add new arg to declaration of isfloat_string.
10
12009-12-04 Eli Zaretskii <eliz@gnu.org> 112009-12-04 Eli Zaretskii <eliz@gnu.org>
2 12
3 * dispextern.h (enum prop_idx) <AUTO_COMPOSED_PROP_IDX>: Delete 13 * dispextern.h (enum prop_idx) <AUTO_COMPOSED_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. */)
1770 CHECK_SYMBOL (variable); 1770 CHECK_SYMBOL (variable);
1771 sym = indirect_variable (XSYMBOL (variable)); 1771 sym = indirect_variable (XSYMBOL (variable));
1772 XSETSYMBOL (variable, sym); 1772 XSETSYMBOL (variable, sym);
1773 1773
1774 valcontents = sym->value; 1774 valcontents = sym->value;
1775 if (BUFFER_LOCAL_VALUEP (valcontents)) 1775 if (BUFFER_LOCAL_VALUEP (valcontents))
1776 { 1776 {
@@ -2353,11 +2353,11 @@ digit_to_number (character, base)
2353DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0, 2353DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2354 doc: /* Parse STRING as a decimal number and return the number. 2354 doc: /* Parse STRING as a decimal number and return the number.
2355This parses both integers and floating point numbers. 2355This parses both integers and floating point numbers.
2356It ignores leading spaces and tabs. 2356It ignores leading spaces and tabs, and all trailing chars.
2357 2357
2358If BASE, interpret STRING as a number in that base. If BASE isn't 2358If BASE, interpret STRING as a number in that base. If BASE isn't
2359present, base 10 is used. BASE must be between 2 and 16 (inclusive). 2359present, base 10 is used. BASE must be between 2 and 16 (inclusive).
2360If the base used is not 10, floating point is not recognized. */) 2360If the base used is not 10, STRING is always parsed as integer. */)
2361 (string, base) 2361 (string, base)
2362 register Lisp_Object string, base; 2362 register Lisp_Object string, base;
2363{ 2363{
@@ -2392,7 +2392,7 @@ If the base used is not 10, floating point is not recognized. */)
2392 else if (*p == '+') 2392 else if (*p == '+')
2393 p++; 2393 p++;
2394 2394
2395 if (isfloat_string (p) && b == 10) 2395 if (isfloat_string (p, 1) && b == 10)
2396 val = make_float (sign * atof (p)); 2396 val = make_float (sign * atof (p));
2397 else 2397 else
2398 { 2398 {
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;
2795extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes; 2795extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes;
2796extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object, 2796extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
2797 Lisp_Object *, Lisp_Object)); 2797 Lisp_Object *, Lisp_Object));
2798extern int isfloat_string P_ ((char *)); 2798extern int isfloat_string P_ ((char *, int));
2799extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object), 2799extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
2800 Lisp_Object)); 2800 Lisp_Object));
2801extern void dir_warning P_ ((char *, Lisp_Object)); 2801extern 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)
3026 } 3026 }
3027 } 3027 }
3028 } 3028 }
3029 if (isfloat_string (read_buffer)) 3029 if (isfloat_string (read_buffer, 0))
3030 { 3030 {
3031 /* Compute NaN and infinities using 0.0 in a variable, 3031 /* Compute NaN and infinities using 0.0 in a variable,
3032 to cope with compilers that think they are smarter 3032 to cope with compilers that think they are smarter
@@ -3244,8 +3244,9 @@ substitute_in_interval (interval, arg)
3244#define EXP_INT 16 3244#define EXP_INT 16
3245 3245
3246int 3246int
3247isfloat_string (cp) 3247isfloat_string (cp, ignore_trailing)
3248 register char *cp; 3248 register char *cp;
3249 int ignore_trailing;
3249{ 3250{
3250 register int state; 3251 register int state;
3251 3252
@@ -3299,7 +3300,8 @@ isfloat_string (cp)
3299 cp += 3; 3300 cp += 3;
3300 } 3301 }
3301 3302
3302 return (((*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f')) 3303 return ((ignore_trailing
3304 || (*cp == 0) || (*cp == ' ') || (*cp == '\t') || (*cp == '\n') || (*cp == '\r') || (*cp == '\f'))
3303 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT) 3305 && (state == (LEAD_INT|DOT_CHAR|TRAIL_INT)
3304 || state == (DOT_CHAR|TRAIL_INT) 3306 || state == (DOT_CHAR|TRAIL_INT)
3305 || state == (LEAD_INT|E_CHAR|EXP_INT) 3307 || state == (LEAD_INT|E_CHAR|EXP_INT)