Index: ../src/doprnt.c =================================================================== --- ../src/doprnt.c (revision 725) +++ ../src/doprnt.c (working copy) @@ -95,10 +95,18 @@ if (format_end == 0) format_end = format + strlen (format); - if ((format_end - format + 1) < sizeof (fixed_buffer)) + +#if defined(_MSC_VER) && defined(_M_X64) + if ((format_end - format + 1 + 3) < sizeof (fixed_buffer)) fmtcpy = fixed_buffer; else - fmtcpy = (char *) alloca (format_end - format + 1); + fmtcpy = (char *) alloca (format_end - format + 1 + 3); +#else + if ((format_end - format + 1 + 1) < sizeof (fixed_buffer)) + fmtcpy = fixed_buffer; + else + fmtcpy = (char *) alloca (format_end - format + 1 + 1); +#endif bufsize--; @@ -173,12 +181,23 @@ error ("Not enough arguments for format string"); if (sizeof (int) == sizeof (EMACS_INT)) ; +#if !defined(_MSC_VER) || !defined(_M_X64) && !defined(_M_IA64) else if (sizeof (long) == sizeof (EMACS_INT)) /* Insert an `l' the right place. */ string[1] = string[0], string[0] = string[-1], string[-1] = 'l', string++; +#else + else if (sizeof (__int64) == sizeof (EMACS_INT)) { + string[3] = string[0]; + string[2] = string[-1]; + string[1] = '4'; + string[0] = '6'; + string[-1] = 'I'; + string += 3; + } +#endif else abort (); sprintf (sprintf_buffer, fmtcpy, args[cnt++]);