aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert2011-04-20 23:03:09 -0700
committerPaul Eggert2011-04-20 23:03:09 -0700
commit452f4150134e4ba7bbd2bad9ce87d19c200505de (patch)
tree776249edb45be8b6811ab6577a4038058a87f315 /src/data.c
parent6703b2e490339a624bb83c9543f1e51ede26b52b (diff)
downloademacs-452f4150134e4ba7bbd2bad9ce87d19c200505de.tar.gz
emacs-452f4150134e4ba7bbd2bad9ce87d19c200505de.zip
Treat large integers as floats in the Lisp reader and in string-to-number.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c38
1 files changed, 3 insertions, 35 deletions
diff --git a/src/data.c b/src/data.c
index 486816cac70..4e81c80d0ed 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2374,26 +2374,6 @@ NUMBER may be an integer or a floating point number. */)
2374 return build_string (buffer); 2374 return build_string (buffer);
2375} 2375}
2376 2376
2377INLINE static int
2378digit_to_number (int character, int base)
2379{
2380 int digit;
2381
2382 if (character >= '0' && character <= '9')
2383 digit = character - '0';
2384 else if (character >= 'a' && character <= 'z')
2385 digit = character - 'a' + 10;
2386 else if (character >= 'A' && character <= 'Z')
2387 digit = character - 'A' + 10;
2388 else
2389 return -1;
2390
2391 if (digit >= base)
2392 return -1;
2393 else
2394 return digit;
2395}
2396
2397DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0, 2377DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0,
2398 doc: /* Parse STRING as a decimal number and return the number. 2378 doc: /* Parse STRING as a decimal number and return the number.
2399This parses both integers and floating point numbers. 2379This parses both integers and floating point numbers.
@@ -2406,7 +2386,7 @@ If the base used is not 10, STRING is always parsed as integer. */)
2406{ 2386{
2407 register char *p; 2387 register char *p;
2408 register int b; 2388 register int b;
2409 EMACS_INT n; 2389 Lisp_Object val;
2410 2390
2411 CHECK_STRING (string); 2391 CHECK_STRING (string);
2412 2392
@@ -2420,25 +2400,13 @@ If the base used is not 10, STRING is always parsed as integer. */)
2420 xsignal1 (Qargs_out_of_range, base); 2400 xsignal1 (Qargs_out_of_range, base);
2421 } 2401 }
2422 2402
2423 /* Skip any whitespace at the front of the number. Typically strtol does
2424 this anyway, so we might as well be consistent. */
2425 p = SSDATA (string); 2403 p = SSDATA (string);
2426 while (*p == ' ' || *p == '\t') 2404 while (*p == ' ' || *p == '\t')
2427 p++; 2405 p++;
2428 2406
2429 if (b == 10) 2407 val = string_to_number (p, b, 1);
2430 { 2408 return NILP (val) ? make_number (0) : val;
2431 Lisp_Object val = string_to_float (p, 1);
2432 if (FLOATP (val))
2433 return val;
2434 }
2435
2436 n = strtol (p, NULL, b);
2437 if (FIXNUM_OVERFLOW_P (n))
2438 xsignal (Qoverflow_error, list1 (string));
2439 return make_number (n);
2440} 2409}
2441
2442 2410
2443enum arithop 2411enum arithop
2444 { 2412 {