vapi: packed enum type generation
[vpp.git] / src / vpp-api / vapi / vapi_c_gen.py
index 381dcba..a881ad5 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 
 import argparse
 import os
@@ -13,10 +13,16 @@ class CField(Field):
         return "vapi_type_%s" % self.name
 
     def get_c_def(self):
-        if self.len is not None:
-            return "%s %s[%d];" % (self.type.get_c_name(), self.name, self.len)
+        if self.type.get_c_name() == 'vl_api_string_t':
+            if self.len:
+                return "u8 %s[%d];" % (self.name, self.len)
+            else:
+                return "vl_api_string_t %s;" % (self.name)
         else:
-            return "%s %s;" % (self.type.get_c_name(), self.name)
+            if self.len is not None:
+                return "%s %s[%d];" % (self.type.get_c_name(), self.name, self.len)
+            else:
+                return "%s %s;" % (self.type.get_c_name(), self.name)
 
     def get_swap_to_be_code(self, struct, var):
         if self.len is not None:
@@ -147,6 +153,12 @@ class CSimpleType (SimpleType):
         'i64': 'be64toh', 'u64': 'be64toh',
     }
 
+    __packed = "__attribute__((packed))"
+    pack_dict = {
+        'i8':  __packed, 'u8':  __packed,
+        'i16': __packed, 'u16': __packed,
+    }
+
     def get_c_name(self):
         return self.name
 
@@ -156,6 +168,9 @@ class CSimpleType (SimpleType):
     def get_swap_to_host_func_name(self):
         return self.swap_to_host_dict[self.name]
 
+    def get_packed_string(self):
+        return self.pack_dict[self.name]
+
     def get_swap_to_be_code(self, struct, var, cast=None):
         x = "%s%s" % (struct, var)
         return "%s = %s%s(%s);" % (x,
@@ -176,14 +191,18 @@ class CSimpleType (SimpleType):
             pass
         return False
 
+    def get_packed(self):
+        return self.pack_dict.get(self.name, "")
+
 
 class CEnum(Enum):
     def get_c_name(self):
         return "vapi_enum_%s" % self.name
 
     def get_c_def(self):
-        return "typedef enum {\n%s\n} %s;" % (
+        return "typedef enum {\n%s\n} %s %s;" % (
             "\n".join(["  %s = %s," % (i, j) for i, j in self.value_pairs]),
+            self.type.get_packed(),
             self.get_c_name()
         )
 
@@ -707,12 +726,12 @@ def gen_json_unified_header(parser, logger, j, io, name):
     emitted = []
     for e in parser.enums_by_json[j]:
         emit_definition(parser, j, emitted, e)
-    for a in parser.aliases_by_json[j]:
-        emit_definition(parser, j, emitted, a)
     for u in parser.unions_by_json[j]:
         emit_definition(parser, j, emitted, u)
     for t in parser.types_by_json[j]:
         emit_definition(parser, j, emitted, t)
+    for a in parser.aliases_by_json[j]:
+        emit_definition(parser, j, emitted, a)
     for m in parser.messages_by_json[j].values():
         emit_definition(parser, j, emitted, m)