@@ -455,6 +455,12 @@ PyCArg_dealloc(PyCArgObject *self)
455455 PyObject_Del (self );
456456}
457457
458+ static int
459+ is_literal_char (unsigned char c )
460+ {
461+ return c < 128 && _PyUnicode_IsPrintable (c ) && c != '\\' && c != '\'' ;
462+ }
463+
458464static PyObject *
459465PyCArg_repr (PyCArgObject * self )
460466{
@@ -501,8 +507,14 @@ PyCArg_repr(PyCArgObject *self)
501507 break ;
502508
503509 case 'c' :
504- sprintf (buffer , "<cparam '%c' (%c)>" ,
505- self -> tag , self -> value .c );
510+ if (is_literal_char ((unsigned char )self -> value .c )) {
511+ sprintf (buffer , "<cparam '%c' ('%c')>" ,
512+ self -> tag , self -> value .c );
513+ }
514+ else {
515+ sprintf (buffer , "<cparam '%c' ('\\x%02x')>" ,
516+ self -> tag , (unsigned char )self -> value .c );
517+ }
506518 break ;
507519
508520/* Hm, are these 'z' and 'Z' codes useful at all?
@@ -517,8 +529,14 @@ PyCArg_repr(PyCArgObject *self)
517529 break ;
518530
519531 default :
520- sprintf (buffer , "<cparam '%c' at %p>" ,
521- self -> tag , self );
532+ if (is_literal_char ((unsigned char )self -> tag )) {
533+ sprintf (buffer , "<cparam '%c' at %p>" ,
534+ (unsigned char )self -> tag , self );
535+ }
536+ else {
537+ sprintf (buffer , "<cparam 0x%02x at %p>" ,
538+ (unsigned char )self -> tag , self );
539+ }
522540 break ;
523541 }
524542 return PyUnicode_FromString (buffer );
0 commit comments