diff --git a/src/print.c b/src/print.c index 53aa353769..53c8c4c91a 100644 --- a/src/print.c +++ b/src/print.c @@ -1908,8 +1908,29 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) { case_Lisp_Int: { - int len = sprintf (buf, "%"pI"d", XFIXNUM (obj)); - strout (buf, len, len, printcharfun); + EMACS_INT c = XFIXNUM (obj); + + if (EQ (Vinteger_output_format, Qt) && CHARACTERP (obj) && c < 4194176) + { + printchar ('?', printcharfun); + + if (escapeflag + && (c == ';' || c == '(' || c == ')' || c == '{' || c == '}' + || c == '[' || c == ']' || c == '\"' || c == '\'' || c == '\\')) + printchar ('\\', printcharfun); + print_string (Fchar_to_string (obj), printcharfun); + } + else if (INTEGERP (Vinteger_output_format) + && XFIXNUM (Vinteger_output_format) == 16 && c >= 0) + { + int len = sprintf (buf, "#x%"pI"x", (EMACS_UINT) c); + strout (buf, len, len, printcharfun); + } + else + { + int len = sprintf (buf, "%"pI"d", c); + strout (buf, len, len, printcharfun); + } } break; @@ -2247,6 +2268,13 @@ syms_of_print (void) that represents the number without losing information. */); Vfloat_output_format = Qnil; + DEFVAR_LISP ("integer-output-format", Vinteger_output_format, + doc: /* The format used to print integers. +When 't', print integers as characters. +When a number 16, print numbers in hex format. +Otherwise, print integers in decimal format. */); + Vinteger_output_format = Qnil; + DEFVAR_LISP ("print-length", Vprint_length, doc: /* Maximum length of list to print before abbreviating. A value of nil means no limit. See also `eval-expression-print-length'. */);