diff mbox series

[RFC,22/32] qapi: New helper c_string()

Message ID 20171002152552.27999-23-armbru@redhat.com
State New
Headers show
Series Command line QAPIfication | expand

Commit Message

Markus Armbruster Oct. 2, 2017, 3:25 p.m. UTC
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(-)
diff mbox series

Patch

diff --git a/scripts/qapi-introspect.py b/scripts/qapi-introspect.py
index 89365449b0..52404b07ab 100644
--- a/scripts/qapi-introspect.py
+++ b/scripts/qapi-introspect.py
@@ -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
diff --git a/scripts/qapi.py b/scripts/qapi.py
index efc128eee0..958249fbd8 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -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