@@ -189,16 +189,31 @@ PyString_FromFormatV(const char *format, va_list vargs)
189189 /* step 1: figure out how large a buffer we need */
190190 for (f = format ; * f ; f ++ ) {
191191 if (* f == '%' ) {
192+ #ifdef HAVE_LONG_LONG
193+ int longlongflag = 0 ;
194+ #endif
192195 const char * p = f ;
193196 while (* ++ f && * f != '%' && !isalpha (Py_CHARMASK (* f )))
194197 ;
195198
196199 /* skip the 'l' or 'z' in {%ld, %zd, %lu, %zu} since
197200 * they don't affect the amount of space we reserve.
198201 */
199- if ((* f == 'l' || * f == 'z' ) &&
200- (f [1 ] == 'd' || f [1 ] == 'u' ))
202+ if (* f == 'l' ) {
203+ if (f [1 ] == 'd' || f [1 ] == 'u' ) {
204+ ++ f ;
205+ }
206+ #ifdef HAVE_LONG_LONG
207+ else if (f [1 ] == 'l' &&
208+ (f [2 ] == 'd' || f [2 ] == 'u' )) {
209+ longlongflag = 1 ;
210+ f += 2 ;
211+ }
212+ #endif
213+ }
214+ else if (* f == 'z' && (f [1 ] == 'd' || f [1 ] == 'u' )) {
201215 ++ f ;
216+ }
202217
203218 switch (* f ) {
204219 case 'c' :
@@ -209,10 +224,21 @@ PyString_FromFormatV(const char *format, va_list vargs)
209224 break ;
210225 case 'd' : case 'u' : case 'i' : case 'x' :
211226 (void ) va_arg (count , int );
212- /* 20 bytes is enough to hold a 64-bit
213- integer. Decimal takes the most space.
214- This isn't enough for octal. */
215- n += 20 ;
227+ #ifdef HAVE_LONG_LONG
228+ /* Need at most
229+ ceil(log10(256)*SIZEOF_LONG_LONG) digits,
230+ plus 1 for the sign. 53/22 is an upper
231+ bound for log10(256). */
232+ if (longlongflag )
233+ n += 2 + (SIZEOF_LONG_LONG * 53 - 1 ) / 22 ;
234+ else
235+ #endif
236+ /* 20 bytes is enough to hold a 64-bit
237+ integer. Decimal takes the most
238+ space. This isn't enough for
239+ octal. */
240+ n += 20 ;
241+
216242 break ;
217243 case 's' :
218244 s = va_arg (count , char * );
@@ -255,6 +281,9 @@ PyString_FromFormatV(const char *format, va_list vargs)
255281 const char * p = f ++ ;
256282 Py_ssize_t i ;
257283 int longflag = 0 ;
284+ #ifdef HAVE_LONG_LONG
285+ int longlongflag = 0 ;
286+ #endif
258287 int size_tflag = 0 ;
259288 /* parse the width.precision part (we're only
260289 interested in the precision value, if any) */
@@ -269,14 +298,22 @@ PyString_FromFormatV(const char *format, va_list vargs)
269298 }
270299 while (* f && * f != '%' && !isalpha (Py_CHARMASK (* f )))
271300 f ++ ;
272- /* handle the long flag, but only for %ld and %lu.
273- others can be added when necessary. */
274- if (* f == 'l' && (f [1 ] == 'd' || f [1 ] == 'u' )) {
275- longflag = 1 ;
276- ++ f ;
301+ /* Handle %ld, %lu, %lld and %llu. */
302+ if (* f == 'l' ) {
303+ if (f [1 ] == 'd' || f [1 ] == 'u' ) {
304+ longflag = 1 ;
305+ ++ f ;
306+ }
307+ #ifdef HAVE_LONG_LONG
308+ else if (f [1 ] == 'l' &&
309+ (f [2 ] == 'd' || f [2 ] == 'u' )) {
310+ longlongflag = 1 ;
311+ f += 2 ;
312+ }
313+ #endif
277314 }
278315 /* handle the size_t flag. */
279- if (* f == 'z' && (f [1 ] == 'd' || f [1 ] == 'u' )) {
316+ else if (* f == 'z' && (f [1 ] == 'd' || f [1 ] == 'u' )) {
280317 size_tflag = 1 ;
281318 ++ f ;
282319 }
@@ -288,6 +325,11 @@ PyString_FromFormatV(const char *format, va_list vargs)
288325 case 'd' :
289326 if (longflag )
290327 sprintf (s , "%ld" , va_arg (vargs , long ));
328+ #ifdef HAVE_LONG_LONG
329+ else if (longlongflag )
330+ sprintf (s , "%" PY_FORMAT_LONG_LONG "d ",
331+ va_arg (vargs , PY_LONG_LONG ));
332+ #endif
291333 else if (size_tflag )
292334 sprintf (s , "%" PY_FORMAT_SIZE_T "d ",
293335 va_arg (vargs , Py_ssize_t ));
@@ -299,6 +341,11 @@ PyString_FromFormatV(const char *format, va_list vargs)
299341 if (longflag )
300342 sprintf (s , "%lu" ,
301343 va_arg (vargs , unsigned long ));
344+ #ifdef HAVE_LONG_LONG
345+ else if (longlongflag )
346+ sprintf (s , "%" PY_FORMAT_LONG_LONG "u",
347+ va_arg (vargs , PY_LONG_LONG ));
348+ #endif
302349 else if (size_tflag )
303350 sprintf (s , "%" PY_FORMAT_SIZE_T "u",
304351 va_arg (vargs , size_t ));
0 commit comments