aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTom Tromey2018-07-05 14:46:26 -0600
committerTom Tromey2018-07-12 22:12:27 -0600
commitd14808cd271abf6a723bf495a6a01c14d18b5893 (patch)
treea576eafcf67c615b5a49d90db71dbc3cbf14c35b /src
parent23eab9a6a67604b5ebcdc99efc42fbfd3345c0b0 (diff)
downloademacs-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.c22
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 {