VAPI: Ensure type definitions are generated in same order as .api file.
[vpp.git] / src / vpp-api / vapi / vapi_c_gen.py
index ef6e266..eaa22c5 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python3
+#!/usr/bin/env python2
 
 import argparse
 import os
@@ -15,7 +15,8 @@ class CField(Field):
             field_type,
             array_len=None,
             nelem_field=None):
-        super().__init__(field_name, field_type, array_len, nelem_field)
+        super(CField, self).__init__(
+            field_name, field_type, array_len, nelem_field)
 
     def get_c_def(self):
         if self.len is not None:
@@ -67,8 +68,15 @@ class CField(Field):
 
 class CStruct(Struct):
     def __init__(self, name, fields):
-        super().__init__(name, fields)
+        super(CStruct, self).__init__(name, fields)
 
+    def duplicate_barrier(func):
+        def func_wrapper(self):
+            name = self.get_c_name()
+            return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self))
+        return func_wrapper
+
+    @duplicate_barrier
     def get_c_def(self):
         return "\n".join([
             "typedef struct __attribute__((__packed__)) {",
@@ -92,7 +100,7 @@ class CSimpleType (SimpleType):
     }
 
     def __init__(self, name):
-        super().__init__(name)
+        super(CSimpleType, self).__init__(name)
 
     def get_c_name(self):
         return self.name
@@ -122,7 +130,7 @@ class CSimpleType (SimpleType):
 
 class CStructType (StructType, CStruct):
     def __init__(self, definition, typedict, field_class):
-        super().__init__(definition, typedict, field_class)
+        super(CStructType, self).__init__(definition, typedict, field_class)
 
     def get_c_name(self):
         return "vapi_type_%s" % self.name
@@ -173,8 +181,9 @@ class CStructType (StructType, CStruct):
 class CMessage (Message):
     def __init__(self, logger, definition, typedict,
                  struct_type_class, simple_type_class, field_class):
-        super().__init__(logger, definition, typedict, struct_type_class,
-                         simple_type_class, field_class)
+        super(CMessage, self).__init__(logger, definition, typedict,
+                                       struct_type_class, simple_type_class,
+                                       field_class)
         self.payload_members = [
             "  %s" % p.get_c_def()
             for p in self.fields
@@ -269,6 +278,13 @@ class CMessage (Message):
             "}",
         ])
 
+    def duplicate_barrier(func):
+        def func_wrapper(self):
+            name = self.get_payload_struct_name()
+            return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self))
+        return func_wrapper
+
+    @duplicate_barrier
     def get_c_def(self):
         if self.has_payload():
             return "\n".join([
@@ -502,11 +518,11 @@ class CMessage (Message):
             '    offsetof(%s, context),' % self.header.get_c_name()
             if has_context else '    0,',
             ('    offsetof(%s, payload),' % self.get_c_name())
-            if self.has_payload() else '    ~0,',
+            if self.has_payload() else '    INVALID_MSG_ID,',
             '    sizeof(%s),' % self.get_c_name(),
             '    (generic_swap_fn_t)%s,' % self.get_swap_to_be_func_name(),
             '    (generic_swap_fn_t)%s,' % self.get_swap_to_host_func_name(),
-            '    ~0,',
+            '    INVALID_MSG_ID,',
             '  };',
             '',
             '  %s = vapi_register_msg(&%s);' %
@@ -570,7 +586,7 @@ def gen_json_unified_header(parser, logger, j, io, name):
     ]))
     print("")
     print("")
-    for t in parser.types_by_json[j].values():
+    for t in parser.types_by_json[j]:
         try:
             print("%s" % t.get_c_def())
             print("")
@@ -582,10 +598,13 @@ def gen_json_unified_header(parser, logger, j, io, name):
 
     print("")
     function_attrs = "static inline "
-    for t in parser.types_by_json[j].values():
+    for t in parser.types_by_json[j]:
+        print("#ifndef defined_inline_%s" % t.get_c_name())
+        print("#define defined_inline_%s" % t.get_c_name())
         print("%s%s" % (function_attrs, t.get_swap_to_be_func_def()))
         print("")
         print("%s%s" % (function_attrs, t.get_swap_to_host_func_def()))
+        print("#endif")
         print("")
     for m in parser.messages_by_json[j].values():
         if m.has_payload():