diff options
| author | Tom Tromey | 2018-07-05 14:46:26 -0600 |
|---|---|---|
| committer | Tom Tromey | 2018-07-12 22:12:27 -0600 |
| commit | d14808cd271abf6a723bf495a6a01c14d18b5893 (patch) | |
| tree | a576eafcf67c615b5a49d90db71dbc3cbf14c35b /src | |
| parent | 23eab9a6a67604b5ebcdc99efc42fbfd3345c0b0 (diff) | |
| download | emacs-d14808cd271abf6a723bf495a6a01c14d18b5893.tar.gz emacs-d14808cd271abf6a723bf495a6a01c14d18b5893.zip | |
Make format handle bignums
* src/editfns.c (styled_format): Handle bignums.
* test/src/editfns-tests.el (read-large-integer): Update.
(format-bignum): New test.
Diffstat (limited to 'src')
| -rw-r--r-- | src/editfns.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/editfns.c b/src/editfns.c index 6b54b41cbd9..09c17cbd926 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -4489,6 +4489,25 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message) | |||
| 4489 | conversion = 's'; | 4489 | conversion = 's'; |
| 4490 | zero_flag = false; | 4490 | zero_flag = false; |
| 4491 | } | 4491 | } |
| 4492 | else if ((conversion == 'd' || conversion == 'i' | ||
| 4493 | || conversion == 'o' || conversion == 'x' | ||
| 4494 | || conversion == 'X') | ||
| 4495 | && BIGNUMP (arg)) | ||
| 4496 | { | ||
| 4497 | int base = 10; | ||
| 4498 | |||
| 4499 | if (conversion == 'o') | ||
| 4500 | base = 8; | ||
| 4501 | else if (conversion == 'x') | ||
| 4502 | base = 16; | ||
| 4503 | else if (conversion == 'X') | ||
| 4504 | base = -16; | ||
| 4505 | |||
| 4506 | char *str = mpz_get_str (NULL, base, XBIGNUM (arg)->value); | ||
| 4507 | arg = make_unibyte_string (str, strlen (str)); | ||
| 4508 | xfree (str); | ||
| 4509 | conversion = 's'; | ||
| 4510 | } | ||
| 4492 | 4511 | ||
| 4493 | if (SYMBOLP (arg)) | 4512 | if (SYMBOLP (arg)) |
| 4494 | { | 4513 | { |
| @@ -4600,7 +4619,8 @@ styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message) | |||
| 4600 | || conversion == 'X')) | 4619 | || conversion == 'X')) |
| 4601 | error ("Invalid format operation %%%c", | 4620 | error ("Invalid format operation %%%c", |
| 4602 | STRING_CHAR ((unsigned char *) format - 1)); | 4621 | STRING_CHAR ((unsigned char *) format - 1)); |
| 4603 | else if (! (FIXNUMP (arg) || (FLOATP (arg) && conversion != 'c'))) | 4622 | else if (! (FIXNUMP (arg) || ((BIGNUMP (arg) || FLOATP (arg)) |
| 4623 | && conversion != 'c'))) | ||
| 4604 | error ("Format specifier doesn't match argument type"); | 4624 | error ("Format specifier doesn't match argument type"); |
| 4605 | else | 4625 | else |
| 4606 | { | 4626 | { |