qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH 22/32] qapi: New helper c_string()


From: Markus Armbruster
Subject: [Qemu-devel] [RFC PATCH 22/32] qapi: New helper c_string()
Date: Mon, 2 Oct 2017 17:25:42 +0200

Use new c_string() to replace qapi-introspect's more limited
to_c_string().

Signed-off-by: Markus Armbruster <address@hidden>
---
 scripts/qapi-introspect.py |  8 ++------
 scripts/qapi.py            | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 6 deletions(-)

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
 
-- 
2.13.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]