diff options
| author | Paul Eggert | 2011-04-20 23:03:09 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-04-20 23:03:09 -0700 |
| commit | 452f4150134e4ba7bbd2bad9ce87d19c200505de (patch) | |
| tree | 776249edb45be8b6811ab6577a4038058a87f315 /src/data.c | |
| parent | 6703b2e490339a624bb83c9543f1e51ede26b52b (diff) | |
| download | emacs-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.c | 38 |
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 | ||
| 2377 | INLINE static int | ||
| 2378 | digit_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 | |||
| 2397 | DEFUN ("string-to-number", Fstring_to_number, Sstring_to_number, 1, 2, 0, | 2377 | DEFUN ("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. |
| 2399 | This parses both integers and floating point numbers. | 2379 | This 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 | ||
| 2443 | enum arithop | 2411 | enum arithop |
| 2444 | { | 2412 | { |