2
2
# QAPI helper library
4
4
# Copyright IBM, Corp. 2011
5
# Copyright (c) 2013 Red Hat Inc.
7
8
# Anthony Liguori <aliguori@us.ibm.com>
9
# Markus Armbruster <armbru@redhat.com>
9
11
# This work is licensed under the terms of the GNU GPLv2.
10
12
# See the COPYING.LIB file in the top-level directory.
12
14
from ordereddict import OrderedDict
18
if ch in ['{', '}', ':', ',', '[', ']']:
27
raise Exception("Mismatched quotes")
45
while tokens[0] != '}':
49
tokens = tokens[1:] # :
51
value, tokens = parse(tokens)
59
elif tokens[0] == '[':
62
while tokens[0] != ']':
63
value, tokens = parse(tokens)
70
return tokens[0], tokens[1:]
73
return parse(map(lambda x: x, tokenize(string)))[0]
18
'str', 'int', 'number', 'bool',
19
'int8', 'int16', 'int32', 'int64',
20
'uint8', 'uint16', 'uint32', 'uint64'
23
builtin_type_qtypes = {
24
'str': 'QTYPE_QSTRING',
26
'number': 'QTYPE_QFLOAT',
27
'bool': 'QTYPE_QBOOL',
29
'int16': 'QTYPE_QINT',
30
'int32': 'QTYPE_QINT',
31
'int64': 'QTYPE_QINT',
32
'uint8': 'QTYPE_QINT',
33
'uint16': 'QTYPE_QINT',
34
'uint32': 'QTYPE_QINT',
35
'uint64': 'QTYPE_QINT',
38
class QAPISchemaError(Exception):
39
def __init__(self, schema, msg):
42
self.line = self.col = 1
43
for ch in schema.src[0:schema.pos]:
48
self.col = (self.col + 7) % 8 + 1
53
return "%s:%s:%s: %s" % (self.fp.name, self.line, self.col, self.msg)
57
def __init__(self, fp):
60
if self.src == '' or self.src[-1] != '\n':
66
while self.tok != None:
67
self.exprs.append(self.get_expr(False))
71
self.tok = self.src[self.cursor]
72
self.pos = self.cursor
77
self.cursor = self.src.find('\n', self.cursor)
78
elif self.tok in ['{', '}', ':', ',', '[', ']']:
84
ch = self.src[self.cursor]
87
raise QAPISchemaError(self,
88
'Missing terminating "\'"')
99
elif self.tok == '\n':
100
if self.cursor == len(self.src):
103
elif not self.tok.isspace():
104
raise QAPISchemaError(self, 'Stray "%s"' % self.tok)
106
def get_members(self):
112
raise QAPISchemaError(self, 'Expected string or "}"')
117
raise QAPISchemaError(self, 'Expected ":"')
119
expr[key] = self.get_expr(True)
124
raise QAPISchemaError(self, 'Expected "," or "}"')
127
raise QAPISchemaError(self, 'Expected string')
129
def get_values(self):
134
if not self.tok in [ '{', '[', "'" ]:
135
raise QAPISchemaError(self, 'Expected "{", "[", "]" or string')
137
expr.append(self.get_expr(True))
142
raise QAPISchemaError(self, 'Expected "," or "]"')
145
def get_expr(self, nested):
146
if self.tok != '{' and not nested:
147
raise QAPISchemaError(self, 'Expected "{"')
150
expr = self.get_members()
151
elif self.tok == '[':
153
expr = self.get_values()
154
elif self.tok == "'":
158
raise QAPISchemaError(self, 'Expected "{", "[" or string')
75
161
def parse_schema(fp):
163
schema = QAPISchema(fp)
164
except QAPISchemaError, e:
165
print >>sys.stderr, e
81
if line.startswith('#') or line == '\n':
84
if line.startswith(' '):
87
expr_eval = evaluate(expr)
88
if expr_eval.has_key('enum'):
89
add_enum(expr_eval['enum'])
90
elif expr_eval.has_key('union'):
91
add_enum('%sKind' % expr_eval['union'])
92
exprs.append(expr_eval)
98
expr_eval = evaluate(expr)
99
if expr_eval.has_key('enum'):
100
add_enum(expr_eval['enum'])
101
elif expr_eval.has_key('union'):
102
add_enum('%sKind' % expr_eval['union'])
103
exprs.append(expr_eval)
170
for expr in schema.exprs:
171
if expr.has_key('enum'):
172
add_enum(expr['enum'])
173
elif expr.has_key('union'):
175
add_enum('%sKind' % expr['union'])
176
elif expr.has_key('type'):
107
182
def parse_args(typeinfo):
183
if isinstance(typeinfo, basestring):
184
struct = find_struct(typeinfo)
185
assert struct != None
186
typeinfo = struct['data']
108
188
for member in typeinfo:
110
190
argentry = typeinfo[member]