1--- src/editfns.c 2007/08/08 07:49:19 1.439.2.3 2+++ src/editfns.c 2007/11/23 13:27:12 1.439.2.9 3@@ -3543,8 +3543,10 @@ 4 precision[n+1] = 10 * precision[n+1] + *format - '0'; 5 } 6 7- if (format - this_format_start + 1 > longest_format) 8- longest_format = format - this_format_start + 1; 9+ /* Extra +1 for 'l' that we may need to insert into the 10+ format. */ 11+ if (format - this_format_start + 2 > longest_format) 12+ longest_format = format - this_format_start + 2; 13 14 if (format == end) 15 error ("Format string ends in middle of format specifier"); 16@@ -3605,7 +3607,7 @@ 17 && *format != 'i' && *format != 'X' && *format != 'c') 18 error ("Invalid format operation %%%c", *format); 19 20- thissize = 30; 21+ thissize = 30 + (precision[n] > 0 ? precision[n] : 0); 22 if (*format == 'c') 23 { 24 if (! SINGLE_BYTE_CHAR_P (XINT (args[n])) 25@@ -3803,23 +3805,40 @@ 26 format - this_format_start); 27 this_format[format - this_format_start] = 0; 28 29- if (INTEGERP (args[n])) 30+ if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g') 31+ sprintf (p, this_format, XFLOAT_DATA (args[n])); 32+ else 33 { 34- if (format[-1] == 'd') 35- sprintf (p, this_format, XINT (args[n])); 36- /* Don't sign-extend for octal or hex printing. */ 37+ if (sizeof (EMACS_INT) > sizeof (int) 38+ && format[-1] != 'c') 39+ { 40+ /* Insert 'l' before format spec. */ 41+ this_format[format - this_format_start] 42+ = this_format[format - this_format_start - 1]; 43+ this_format[format - this_format_start - 1] = 'l'; 44+ this_format[format - this_format_start + 1] = 0; 45+ } 46+ 47+ if (INTEGERP (args[n])) 48+ { 49+ if (format[-1] == 'c') 50+ sprintf (p, this_format, (int) XINT (args[n])); 51+ else if (format[-1] == 'd') 52+ sprintf (p, this_format, XINT (args[n])); 53+ /* Don't sign-extend for octal or hex printing. */ 54+ else 55+ sprintf (p, this_format, XUINT (args[n])); 56+ } 57+ else if (format[-1] == 'c') 58+ sprintf (p, this_format, (int) XFLOAT_DATA (args[n])); 59+ else if (format[-1] == 'd') 60+ /* Maybe we should use "%1.0f" instead so it also works 61+ for values larger than MAXINT. */ 62+ sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n])); 63 else 64- sprintf (p, this_format, XUINT (args[n])); 65+ /* Don't sign-extend for octal or hex printing. */ 66+ sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n])); 67 } 68- else if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g') 69- sprintf (p, this_format, XFLOAT_DATA (args[n])); 70- else if (format[-1] == 'd') 71- /* Maybe we should use "%1.0f" instead so it also works 72- for values larger than MAXINT. */ 73- sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n])); 74- else 75- /* Don't sign-extend for octal or hex printing. */ 76- sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n])); 77 78 if (p > buf 79 && multibyte 80