diff options
| author | Tom Tromey | 2018-07-07 15:44:15 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:27 -0600 |
| commit | eefa65e90392df9bab287b0de5dedf73b40ca0fc (patch) | |
| tree | 95927c74ad3335b8b720e977d06386c190009599 /src | |
| parent | 1e8ae6ca237e22e11b3db63a01e558ad5a3d6ef3 (diff) | |
| download | emacs-eefa65e90392df9bab287b0de5dedf73b40ca0fc.tar.gz emacs-eefa65e90392df9bab287b0de5dedf73b40ca0fc.zip | |
Make comparison operators handle bignums
* sc/data.c (bignumcompare): New function.
(arithcompare): Handle bignums.
Diffstat (limited to 'src')
| -rw-r--r-- | src/data.c | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/src/data.c b/src/data.c index 8ffed8bbb52..97554c7e1d2 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -2397,6 +2397,70 @@ bool-vector. IDX starts at 0. */) | |||
| 2397 | 2397 | ||
| 2398 | /* Arithmetic functions */ | 2398 | /* Arithmetic functions */ |
| 2399 | 2399 | ||
| 2400 | static Lisp_Object | ||
| 2401 | bignumcompare (Lisp_Object num1, Lisp_Object num2, | ||
| 2402 | enum Arith_Comparison comparison) | ||
| 2403 | { | ||
| 2404 | int cmp; | ||
| 2405 | bool test; | ||
| 2406 | |||
| 2407 | if (BIGNUMP (num1)) | ||
| 2408 | { | ||
| 2409 | if (FLOATP (num2)) | ||
| 2410 | cmp = mpz_cmp_d (XBIGNUM (num1)->value, XFLOAT_DATA (num2)); | ||
| 2411 | else if (FIXNUMP (num2)) | ||
| 2412 | cmp = mpz_cmp_si (XBIGNUM (num1)->value, XINT (num2)); | ||
| 2413 | else | ||
| 2414 | { | ||
| 2415 | eassume (BIGNUMP (num2)); | ||
| 2416 | cmp = mpz_cmp (XBIGNUM (num1)->value, XBIGNUM (num2)->value); | ||
| 2417 | } | ||
| 2418 | } | ||
| 2419 | else | ||
| 2420 | { | ||
| 2421 | eassume (BIGNUMP (num2)); | ||
| 2422 | if (FLOATP (num1)) | ||
| 2423 | cmp = - mpz_cmp_d (XBIGNUM (num2)->value, XFLOAT_DATA (num1)); | ||
| 2424 | else | ||
| 2425 | { | ||
| 2426 | eassume (FIXNUMP (num1)); | ||
| 2427 | cmp = - mpz_cmp_si (XBIGNUM (num2)->value, XINT (num1)); | ||
| 2428 | } | ||
| 2429 | } | ||
| 2430 | |||
| 2431 | switch (comparison) | ||
| 2432 | { | ||
| 2433 | case ARITH_EQUAL: | ||
| 2434 | test = cmp == 0; | ||
| 2435 | break; | ||
| 2436 | |||
| 2437 | case ARITH_NOTEQUAL: | ||
| 2438 | test = cmp != 0; | ||
| 2439 | break; | ||
| 2440 | |||
| 2441 | case ARITH_LESS: | ||
| 2442 | test = cmp < 0; | ||
| 2443 | break; | ||
| 2444 | |||
| 2445 | case ARITH_LESS_OR_EQUAL: | ||
| 2446 | test = cmp <= 0; | ||
| 2447 | break; | ||
| 2448 | |||
| 2449 | case ARITH_GRTR: | ||
| 2450 | test = cmp > 0; | ||
| 2451 | break; | ||
| 2452 | |||
| 2453 | case ARITH_GRTR_OR_EQUAL: | ||
| 2454 | test = cmp >= 0; | ||
| 2455 | break; | ||
| 2456 | |||
| 2457 | default: | ||
| 2458 | eassume (false); | ||
| 2459 | } | ||
| 2460 | |||
| 2461 | return test ? Qt : Qnil; | ||
| 2462 | } | ||
| 2463 | |||
| 2400 | Lisp_Object | 2464 | Lisp_Object |
| 2401 | arithcompare (Lisp_Object num1, Lisp_Object num2, | 2465 | arithcompare (Lisp_Object num1, Lisp_Object num2, |
| 2402 | enum Arith_Comparison comparison) | 2466 | enum Arith_Comparison comparison) |
| @@ -2406,8 +2470,11 @@ arithcompare (Lisp_Object num1, Lisp_Object num2, | |||
| 2406 | bool fneq; | 2470 | bool fneq; |
| 2407 | bool test; | 2471 | bool test; |
| 2408 | 2472 | ||
| 2409 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (num1); | 2473 | CHECK_NUMBER_COERCE_MARKER (num1); |
| 2410 | CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER (num2); | 2474 | CHECK_NUMBER_COERCE_MARKER (num2); |
| 2475 | |||
| 2476 | if (BIGNUMP (num1) || BIGNUMP (num2)) | ||
| 2477 | return bignumcompare (num1, num2, comparison); | ||
| 2411 | 2478 | ||
| 2412 | /* If either arg is floating point, set F1 and F2 to the 'double' | 2479 | /* If either arg is floating point, set F1 and F2 to the 'double' |
| 2413 | approximations of the two arguments, and set FNEQ if floating-point | 2480 | approximations of the two arguments, and set FNEQ if floating-point |