Use new c_string() to replace qapi-introspect's more limited to_c_string().
Signed-off-by: Markus Armbruster <[email protected]> --- 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
