• Paul Eggert's avatar
    %o and %x can now format signed integers · 4a56ca5b
    Paul Eggert authored
    Optionally treat integers as signed numbers with %o
    and %x format specifiers, instead of treating them as
    a machine-dependent two’s complement representation.
    This option is more machine-independent, allows formats
    like "#x%x" to be useful for reading later, and is
    better-insulated for future changes involving bignums.
    Setting the new variable ‘binary-as-unsigned’ to nil
    enables the new behavior (Bug#32252).
    This is a simplified version of the change proposed in:
    https://lists.gnu.org/r/emacs-devel/2018-07/msg00763.html
    I simplified that proposal by omitting bitwidth modifiers, as
    I could not find an any example uses in the Emacs source code
    that needed them and doing them correctly would have been
    quite a bit more work for apparently little benefit.
    * doc/lispref/strings.texi (Formatting Strings):
    Document that %x and %o format negative integers in a
    platform-dependent way.  Also, document how to format
    numbers so that the same values can be read back in.
    * etc/NEWS: Document the change.
    * src/editfns.c (styled_format): Treat integers as signed
    numbers even with %o and %x, if binary-as-unsigned is nil.
    Support the + and space flags with %o and %x, since they’re
    about signs.
    (syms_of_editfns): New variable binary-as-unsigned.
    * test/src/editfns-tests.el (read-large-integer):
    Test that maximal integers can be read after printing
    with all integer formats, if binary-as-unsigned is nil.
    4a56ca5b
editfns.c 176 KB