bpo-20180: Simplify char_converter in Argument Clinic. (GH-9828)
Fix also handling non-ascii default values.
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index cd492b4..b0acbcf 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2562,29 +2562,14 @@
format_unit = 'c'
c_ignored_default = "'\0'"
- # characters which need to be escaped in C code
- _escapes = {x: r'\%d' % x for x in range(7)}
- _escapes.update({
- 0x07: r'\a',
- 0x08: r'\b',
- 0x09: r'\t',
- 0x0A: r'\n',
- 0x0B: r'\v',
- 0x0C: r'\f',
- 0x0D: r'\r',
- 0x22: r'\"',
- 0x27: r'\'',
- 0x3F: r'\?',
- 0x5C: r'\\',
- })
-
def converter_init(self):
if isinstance(self.default, self.default_type):
if len(self.default) != 1:
fail("char_converter: illegal default value " + repr(self.default))
- c_ord = self.default[0]
- self.c_default = "'%s'" % self._escapes.get(c_ord, chr(c_ord))
+ self.c_default = repr(bytes(self.default))[1:]
+ if self.c_default == '"\'"':
+ self.c_default = r"'\''"
@add_legacy_c_converter('B', bitwise=True)