@@ -461,58 +461,47 @@ is_literal_char(unsigned char c)
461461static PyObject *
462462PyCArg_repr (PyCArgObject * self )
463463{
464- char buffer [256 ];
465464 switch (self -> tag ) {
466465 case 'b' :
467466 case 'B' :
468- sprintf ( buffer , "<cparam '%c' (%d)>" ,
467+ return PyUnicode_FromFormat ( "<cparam '%c' (%d)>" ,
469468 self -> tag , self -> value .b );
470- break ;
471469 case 'h' :
472470 case 'H' :
473- sprintf ( buffer , "<cparam '%c' (%d)>" ,
471+ return PyUnicode_FromFormat ( "<cparam '%c' (%d)>" ,
474472 self -> tag , self -> value .h );
475- break ;
476473 case 'i' :
477474 case 'I' :
478- sprintf ( buffer , "<cparam '%c' (%d)>" ,
475+ return PyUnicode_FromFormat ( "<cparam '%c' (%d)>" ,
479476 self -> tag , self -> value .i );
480- break ;
481477 case 'l' :
482478 case 'L' :
483- sprintf ( buffer , "<cparam '%c' (%ld)>" ,
479+ return PyUnicode_FromFormat ( "<cparam '%c' (%ld)>" ,
484480 self -> tag , self -> value .l );
485- break ;
486481
487482 case 'q' :
488483 case 'Q' :
489- sprintf (buffer ,
490- #ifdef MS_WIN32
491- "<cparam '%c' (%I64d)>" ,
492- #else
493- "<cparam '%c' (%lld)>" ,
494- #endif
484+ return PyUnicode_FromFormat ("<cparam '%c' (%lld)>" ,
495485 self -> tag , self -> value .q );
496- break ;
497486 case 'd' :
498- sprintf (buffer , "<cparam '%c' (%f)>" ,
499- self -> tag , self -> value .d );
500- break ;
501- case 'f' :
502- sprintf (buffer , "<cparam '%c' (%f)>" ,
503- self -> tag , self -> value .f );
504- break ;
505-
487+ case 'f' : {
488+ PyObject * f = PyFloat_FromDouble ((self -> tag == 'f' ) ? self -> value .f : self -> value .d );
489+ if (f == NULL ) {
490+ return NULL ;
491+ }
492+ PyObject * result = PyUnicode_FromFormat ("<cparam '%c' (%R)>" , self -> tag , f );
493+ Py_DECREF (f );
494+ return result ;
495+ }
506496 case 'c' :
507497 if (is_literal_char ((unsigned char )self -> value .c )) {
508- sprintf ( buffer , "<cparam '%c' ('%c')>" ,
498+ return PyUnicode_FromFormat ( "<cparam '%c' ('%c')>" ,
509499 self -> tag , self -> value .c );
510500 }
511501 else {
512- sprintf ( buffer , "<cparam '%c' ('\\x%02x')>" ,
502+ return PyUnicode_FromFormat ( "<cparam '%c' ('\\x%02x')>" ,
513503 self -> tag , (unsigned char )self -> value .c );
514504 }
515- break ;
516505
517506/* Hm, are these 'z' and 'Z' codes useful at all?
518507 Shouldn't they be replaced by the functionality of c_string
@@ -521,22 +510,20 @@ PyCArg_repr(PyCArgObject *self)
521510 case 'z' :
522511 case 'Z' :
523512 case 'P' :
524- sprintf ( buffer , "<cparam '%c' (%p)>" ,
513+ return PyUnicode_FromFormat ( "<cparam '%c' (%p)>" ,
525514 self -> tag , self -> value .p );
526515 break ;
527516
528517 default :
529518 if (is_literal_char ((unsigned char )self -> tag )) {
530- sprintf ( buffer , "<cparam '%c' at %p>" ,
531- (unsigned char )self -> tag , self );
519+ return PyUnicode_FromFormat ( "<cparam '%c' at %p>" ,
520+ (unsigned char )self -> tag , ( void * ) self );
532521 }
533522 else {
534- sprintf ( buffer , "<cparam 0x%02x at %p>" ,
535- (unsigned char )self -> tag , self );
523+ return PyUnicode_FromFormat ( "<cparam 0x%02x at %p>" ,
524+ (unsigned char )self -> tag , ( void * ) self );
536525 }
537- break ;
538526 }
539- return PyUnicode_FromString (buffer );
540527}
541528
542529static PyMemberDef PyCArgType_members [] = {
0 commit comments