+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))
+
+