diff options
author | Andreas Schwab <schwab@suse.de> | 2007-11-15 23:45:21 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2007-11-15 23:45:21 +0000 |
commit | f52fcaa4f399a0f96d4be0bcaa8342818f15e82b (patch) | |
tree | 7ca95bd1e414205f965800c2a5b4b11f8d6774f6 /src/editfns.c | |
parent | 3b58b87349b6d8bae3ad7c8da3affec6d435de29 (diff) | |
download | emacs-f52fcaa4f399a0f96d4be0bcaa8342818f15e82b.tar.gz |
(Fformat): Correctly format EMACS_INT values.
Diffstat (limited to 'src/editfns.c')
-rw-r--r-- | src/editfns.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/editfns.c b/src/editfns.c index 6c6742d242e..fb9c1c96b59 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -3803,23 +3803,35 @@ usage: (format STRING &rest OBJECTS) */) format - this_format_start); this_format[format - this_format_start] = 0; - if (INTEGERP (args[n])) + if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g') + sprintf (p, this_format, XFLOAT_DATA (args[n])); + else { - if (format[-1] == 'd') - sprintf (p, this_format, XINT (args[n])); - /* Don't sign-extend for octal or hex printing. */ + if (sizeof (EMACS_INT) > sizeof (int)) + { + /* Insert 'l' before format spec. */ + this_format[format - this_format_start] + = this_format[format - this_format_start - 1]; + this_format[format - this_format_start - 1] = 'l'; + this_format[format - this_format_start + 1] = 0; + } + + if (INTEGERP (args[n])) + { + if (format[-1] == 'd') + sprintf (p, this_format, XINT (args[n])); + /* Don't sign-extend for octal or hex printing. */ + else + sprintf (p, this_format, XUINT (args[n])); + } + else if (format[-1] == 'd') + /* Maybe we should use "%1.0f" instead so it also works + for values larger than MAXINT. */ + sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n])); else - sprintf (p, this_format, XUINT (args[n])); + /* Don't sign-extend for octal or hex printing. */ + sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n])); } - else if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g') - sprintf (p, this_format, XFLOAT_DATA (args[n])); - else if (format[-1] == 'd') - /* Maybe we should use "%1.0f" instead so it also works - for values larger than MAXINT. */ - sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n])); - else - /* Don't sign-extend for octal or hex printing. */ - sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n])); if (p > buf && multibyte |