From: Paul Eggert Date: Wed, 27 Apr 2011 18:22:21 +0000 (-0700) Subject: * doprnt.c (doprnt): Support "ll" length modifier, for long long. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~193^2~4 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e810457d006d336b26335fae512d15a1c445b9cd;p=emacs.git * doprnt.c (doprnt): Support "ll" length modifier, for long long. --- diff --git a/src/ChangeLog b/src/ChangeLog index e2ac23256a7..b23904a3575 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2011-04-27 Paul Eggert + + * doprnt.c (doprnt): Support "ll" length modifier, for long long. + 2011-04-27 Yoshiaki Kasahara (tiny change) * buffer.c (init_buffer) [USE_MMAP_FOR_BUFFERS]: Adjust to aliasing diff --git a/src/doprnt.c b/src/doprnt.c index 3ac1d9963a9..229ad06e057 100644 --- a/src/doprnt.c +++ b/src/doprnt.c @@ -80,7 +80,9 @@ along with GNU Emacs. If not, see . */ The l (lower-case letter ell) flag is a `long' data type modifier: it is supported for %d, %o, and %x conversions of integral arguments, and means that the respective argument is to be treated as `long int' or `unsigned - long int'. The EMACS_INT data type should use this modifier. + long int'. ll means to use 'long long'. EMACS_INT arguments + should use the pI macro, which expands to whatever length modifier + is needed for the target host, e.g., "", "l", "ll". The width specifier supplies a lower limit for the length of the printed representation. The padding, if any, normally goes on the left, but it goes @@ -205,6 +207,11 @@ doprnt (char *buffer, register size_t bufsize, const char *format, else if (*fmt == 'l') { long_flag = 1; + if (fmt[1] == 'l') + { + long_flag = 2; + fmt++; + } if (!strchr ("dox", fmt[1])) /* %l as conversion specifier, not as modifier. */ break; @@ -244,7 +251,16 @@ doprnt (char *buffer, register size_t bufsize, const char *format, int i; long l; - if (long_flag) + if (1 < long_flag) + { +#ifdef HAVE_LONG_LONG_INT + long long ll = va_arg (ap, long long); + sprintf (sprintf_buffer, fmtcpy, ll); +#else + abort (); +#endif + } + else if (long_flag) { l = va_arg(ap, long); sprintf (sprintf_buffer, fmtcpy, l); @@ -265,7 +281,16 @@ doprnt (char *buffer, register size_t bufsize, const char *format, unsigned u; unsigned long ul; - if (long_flag) + if (1 < long_flag) + { +#ifdef HAVE_UNSIGNED_LONG_LONG_INT + unsigned long long ull = va_arg (ap, unsigned long long); + sprintf (sprintf_buffer, fmtcpy, ull); +#else + abort (); +#endif + } + else if (long_flag) { ul = va_arg(ap, unsigned long); sprintf (sprintf_buffer, fmtcpy, ul);