diff options
| author | Juanma Barranquero | 2009-12-04 16:16:26 +0000 |
|---|---|---|
| committer | Juanma Barranquero | 2009-12-04 16:16:26 +0000 |
| commit | be95bee9b8cf3f771fdb6438a44ded2880e65617 (patch) | |
| tree | fe4ccba69d57fbd4f7d72bcc0f37d24a3fd490a5 | |
| parent | 24c2d7ce87ac4e656d3c9c55b39f7b44d76e8f7a (diff) | |
| download | emacs-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/ChangeLog | 10 | ||||
| -rw-r--r-- | src/data.c | 8 | ||||
| -rw-r--r-- | src/lisp.h | 2 | ||||
| -rw-r--r-- | 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 @@ | |||
| 1 | 2009-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 | |||
| 1 | 2009-12-04 Eli Zaretskii <eliz@gnu.org> | 11 | 2009-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) | |||
| 2353 | DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0, | 2353 | DEFUN ("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. |
| 2355 | This parses both integers and floating point numbers. | 2355 | This parses both integers and floating point numbers. |
| 2356 | It ignores leading spaces and tabs. | 2356 | It ignores leading spaces and tabs, and all trailing chars. |
| 2357 | 2357 | ||
| 2358 | If BASE, interpret STRING as a number in that base. If BASE isn't | 2358 | If BASE, interpret STRING as a number in that base. If BASE isn't |
| 2359 | present, base 10 is used. BASE must be between 2 and 16 (inclusive). | 2359 | present, base 10 is used. BASE must be between 2 and 16 (inclusive). |
| 2360 | If the base used is not 10, floating point is not recognized. */) | 2360 | If 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; | |||
| 2795 | extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes; | 2795 | extern Lisp_Object Vload_history, Vload_suffixes, Vload_file_rep_suffixes; |
| 2796 | extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object, | 2796 | extern int openp P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
| 2797 | Lisp_Object *, Lisp_Object)); | 2797 | Lisp_Object *, Lisp_Object)); |
| 2798 | extern int isfloat_string P_ ((char *)); | 2798 | extern int isfloat_string P_ ((char *, int)); |
| 2799 | extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object), | 2799 | extern void map_obarray P_ ((Lisp_Object, void (*) (Lisp_Object, Lisp_Object), |
| 2800 | Lisp_Object)); | 2800 | Lisp_Object)); |
| 2801 | extern void dir_warning P_ ((char *, Lisp_Object)); | 2801 | 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) | |||
| 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 | ||
| 3246 | int | 3246 | int |
| 3247 | isfloat_string (cp) | 3247 | isfloat_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) |