From 2959d42feb576c0e00c28c4e27658b25f6c783e9 Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Thu, 22 Aug 2019 09:02:59 +0200 Subject: api: use string type for strings in memclnt.api Explicitly using string type in API allows for autogenerating tools to print strings instead of hex-dumping byte strings. Type: fix Signed-off-by: Ole Troan Signed-off-by: Klement Sekera Change-Id: I573962d6b34d5d10aab9dc6a5fdf101c9b12a6a6 Signed-off-by: Ole Troan --- src/vpp-api/vapi/vapi_c_gen.py | 5 +- src/vpp-api/vapi/vapi_json_parser.py | 119 ++++++++++++++--------------------- 2 files changed, 51 insertions(+), 73 deletions(-) (limited to 'src/vpp-api') diff --git a/src/vpp-api/vapi/vapi_c_gen.py b/src/vpp-api/vapi/vapi_c_gen.py index 381dcba7f42..047bb2c680a 100755 --- a/src/vpp-api/vapi/vapi_c_gen.py +++ b/src/vpp-api/vapi/vapi_c_gen.py @@ -14,7 +14,10 @@ class CField(Field): def get_c_def(self): if self.len is not None: - return "%s %s[%d];" % (self.type.get_c_name(), self.name, self.len) + try: + return "%s %s[%d];" % (self.type.get_c_name(), self.name, self.len) + except: + raise Exception("%s %s[%s];" % (self.type.get_c_name(), self.name, self.len)) else: return "%s %s;" % (self.type.get_c_name(), self.name) diff --git a/src/vpp-api/vapi/vapi_json_parser.py b/src/vpp-api/vapi/vapi_json_parser.py index a9d2c8186bc..d0f8de03617 100644 --- a/src/vpp-api/vapi/vapi_json_parser.py +++ b/src/vpp-api/vapi/vapi_json_parser.py @@ -167,48 +167,9 @@ class Message(object): else: field_type = json_parser.lookup_type_like_id(field[0]) logger.debug("Parsing message field `%s'" % field) - l = len(field) - if any(type(n) is dict for n in field): - l -= 1 - if l == 2: - if self.header is not None and\ - self.header.has_field(field[1]): - continue - p = field_class(field_name=field[1], - field_type=field_type) - elif l == 3: - if field[2] == 0: - raise ParseError( - "While parsing message `%s': variable length " - "array `%s' doesn't have reference to member " - "containing the actual length" % ( - name, field[1])) - p = field_class( - field_name=field[1], - field_type=field_type, - array_len=field[2]) - elif l == 4: - nelem_field = None - for f in fields: - if f.name == field[3]: - nelem_field = f - if nelem_field is None: - raise ParseError( - "While parsing message `%s': couldn't find " - "variable length array `%s' member containing " - "the actual length `%s'" % ( - name, field[1], field[3])) - p = field_class( - field_name=field[1], - field_type=field_type, - array_len=field[2], - nelem_field=nelem_field) - else: - raise Exception("Don't know how to parse message " - "definition for message `%s': `%s'" % - (m, m[1:])) - logger.debug("Parsed field `%s'" % p) - fields.append(p) + f = parse_field(field_class, fields, field, field_type) + logger.debug("Parsed field `%s'" % f) + fields.append(f) self.fields = fields self.depends = [f.type for f in self.fields] logger.debug("Parsed message: %s" % self) @@ -220,6 +181,48 @@ class Message(object): self.crc) +def parse_field(field_class, fields, field, field_type): + l = len(field) + if l > 2: + if type(field[2]) is dict: + if "limit" in field[2]: + array_len = field[2]["limit"] + else: + l -= 1 + else: + array_len = field[2] + + if l == 2: + return field_class(field_name=field[1], + field_type=field_type) + elif l == 3: + if field[2] == 0: + raise ParseError("While parsing type `%s': array `%s' has " + "variable length" % (name, field[1])) + return field_class(field_name=field[1], + field_type=field_type, + array_len=array_len) + elif l == 4: + nelem_field = None + for f in fields: + if f.name == field[3]: + nelem_field = f + if nelem_field is None: + raise ParseError( + "While parsing message `%s': couldn't find " + "variable length array `%s' member containing " + "the actual length `%s'" % ( + name, field[1], field[3])) + return field_class(field_name=field[1], + field_type=field_type, + array_len=array_len, + nelem_field=nelem_field) + else: + raise ParseError( + "Don't know how to parse field `%s' of type definition " + "for type `%s'" % (field, t)) + + class StructType (Type, Struct): def __init__(self, definition, json_parser, field_class, logger): @@ -233,36 +236,8 @@ class StructType (Type, Struct): continue field_type = json_parser.lookup_type_like_id(field[0]) logger.debug("Parsing type field `%s'" % field) - if len(field) == 2: - p = field_class(field_name=field[1], - field_type=field_type) - elif len(field) == 3: - if field[2] == 0: - raise ParseError("While parsing type `%s': array `%s' has " - "variable length" % (name, field[1])) - p = field_class(field_name=field[1], - field_type=field_type, - array_len=field[2]) - elif len(field) == 4: - nelem_field = None - for f in fields: - if f.name == field[3]: - nelem_field = f - if nelem_field is None: - raise ParseError( - "While parsing message `%s': couldn't find " - "variable length array `%s' member containing " - "the actual length `%s'" % ( - name, field[1], field[3])) - p = field_class(field_name=field[1], - field_type=field_type, - array_len=field[2], - nelem_field=nelem_field) - else: - raise ParseError( - "Don't know how to parse field `%s' of type definition " - "for type `%s'" % (field, t)) - fields.append(p) + f = parse_field(field_class, fields, field, field_type) + fields.append(f) Type.__init__(self, name) Struct.__init__(self, name, fields) -- cgit 1.2.3-korg