]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix `string-to-number' to deal consistently with integers and floats.
authorJuanma Barranquero <lekktu@gmail.com>
Fri, 4 Dec 2009 16:16:26 +0000 (16:16 +0000)
committerJuanma Barranquero <lekktu@gmail.com>
Fri, 4 Dec 2009 16:16:26 +0000 (16:16 +0000)
* 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
src/data.c
src/lisp.h
src/lread.c

index 3ee60381fe875d7dda275e7f4d39f85f46ff168c..35100e126a3e4b2ac12f1faad95516ba455d5581 100644 (file)
@@ -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
index ce2d842de44df221f142bb4886a3e5136a8efb75..0f47556fe45ef3993dd2792c7718e9faa2c3defd 100644 (file)
@@ -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
     {
index 2052dfa0afcd20d94f2729ab1ae8876349bf2b5f..3bdecc510339a40940786ea7a6d7e76efcf7cabf 100644 (file)
@@ -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));
index 97b9410b03893dc3d8f1cbba7306be0986a22647..0649c638d9895fc1c0977bbce5cb04ee1b84e993 100644 (file)
@@ -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)