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