summary refs log tree commit diff stats
path: root/scripts/qapi.py
diff options
context:
space:
mode:
authorLuiz Capitulino <lcapitulino@redhat.com>2012-06-29 20:53:37 -0300
committerLuiz Capitulino <lcapitulino@redhat.com>2012-08-01 18:09:29 -0300
commite0d45df7a5794b6821d2f8893a7f343109debab9 (patch)
treeabdcb756748095b76b32fa0051a08630af53755f /scripts/qapi.py
parent02d2bd5d57812154cfb978bc2098cf49d551583d (diff)
downloadfocaccia-qemu-e0d45df7a5794b6821d2f8893a7f343109debab9.tar.gz
focaccia-qemu-e0d45df7a5794b6821d2f8893a7f343109debab9.zip
qapi: qapi.py: allow the "'" character to be escaped
Support escaping the escape character, and make more robust (don't die
for '', handle ' without matching '.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Diffstat (limited to 'scripts/qapi.py')
-rw-r--r--scripts/qapi.py31
1 files changed, 21 insertions, 10 deletions
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 8082af3fcd..d3b8b4d851 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -13,18 +13,29 @@ from ordereddict import OrderedDict
 
 def tokenize(data):
     while len(data):
-        if data[0] in ['{', '}', ':', ',', '[', ']']:
-            yield data[0]
-            data = data[1:]
-        elif data[0] in ' \n':
-            data = data[1:]
-        elif data[0] == "'":
-            data = data[1:]
+        ch = data[0]
+        data = data[1:]
+        if ch in ['{', '}', ':', ',', '[', ']']:
+            yield ch
+        elif ch in ' \n':
+            None
+        elif ch == "'":
             string = ''
-            while data[0] != "'":
-                string += data[0]
+            esc = False
+            while True:
+                if (data == ''):
+                    raise Exception("Mismatched quotes")
+                ch = data[0]
                 data = data[1:]
-            data = data[1:]
+                if esc:
+                    string += ch
+                    esc = False
+                elif ch == "\\":
+                    esc = True
+                elif ch == "'":
+                    break
+                else:
+                    string += ch
             yield string
 
 def parse(tokens):