@@ -35,10 +35,6 @@ def to_json(obj, level=0):
return ret
-def to_c_string(string):
- return '"' + string.replace('\\', r'\\').replace('"', r'\"') + '"'
-
-
class QAPISchemaGenIntrospectVisitor(QAPISchemaVisitor):
def __init__(self, unmask):
self._unmask = unmask
@@ -70,12 +66,12 @@ extern const char %(c_name)s[];
''',
c_name=c_name(name))
lines = to_json(jsons).split('\n')
- c_string = '\n '.join([to_c_string(line) for line in lines])
self.defn = mcgen('''
const char %(c_name)s[] = %(c_string)s;
''',
c_name=c_name(name),
- c_string=c_string)
+ c_string='\n '.join([c_string(line)
+ for line in lines]))
self._schema = None
self._jsons = None
self._used_types = None
@@ -1915,6 +1915,21 @@ def c_name(name, protect=True):
return 'q_' + name
return name
+
+def c_string(string):
+ def escape_ch(match):
+ ch = match.group(0)
+ esc = {'\a': 'a', '\b': 'b', '\f': 'f', '\n': 'n', '\r': 'r',
+ '\t': 't', '\v': 'v', '"': r'"', '\\': '\\'}.get(ch)
+ if not esc:
+ esc = 'x%02x' % ord(ch)
+ return '\\' + esc
+
+ if string is None:
+ return "NULL"
+ return '"' + re.sub(r'[\0-\37"\\\177]', escape_ch, string) + '"'
+
+
eatspace = '\033EATSPACE.'
pointer_suffix = ' *' + eatspace
Use new c_string() to replace qapi-introspect's more limited to_c_string(). Signed-off-by: Markus Armbruster <armbru@redhat.com> --- scripts/qapi-introspect.py | 8 ++------ scripts/qapi.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-)