scripts: Add generation of struct_size_helper header

Added generator-side plumbing to create the vk_struct_size_helper.h
file.

Change-Id: I5ff226131b8db2d773e4422877bdb2993ed76cf4
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 4e18bf3..59c96e0 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -75,10 +75,10 @@
                  diagFile = sys.stdout):
         OutputGenerator.__init__(self, errFile, warnFile, diagFile)
         # Internal state - accumulators for different inner block text
-        self.enum_output = ''      # string built up of enum string routines
-        self.enum_list = ()
+        self.enum_output = ''                             # string built up of enum string routines
+        self.struct_size_h_output = ''                    # string built up of struct size header output
+        self.struct_size_c_output = ''                    # string built up of struct size source output
         # Internal state - accumulators for different inner block text
-        ########## self.sections = dict([(section, []) for section in self.ALL_SECTIONS])
         self.structNames = []                             # List of Vulkan struct typenames
         self.structTypes = dict()                         # Map of Vulkan struct typename to required VkStructureType
         self.handleTypes = set()                          # Set of handle type names
@@ -89,7 +89,7 @@
         self.StructType = namedtuple('StructType', ['name', 'value'])
         self.CommandParam = namedtuple('CommandParam', ['type', 'name', 'ispointer', 'isconst', 'iscount', 'len', 'extstructs', 'cdecl', 'islocal', 'iscreate', 'isdestroy'])
         self.CommandData = namedtuple('CommandData', ['name', 'return_type', 'params', 'cdecl'])
-        self.StructMemberData = namedtuple('StructMemberData', ['name', 'members'])
+        self.StructMemberData = namedtuple('StructMemberData', ['name', 'members', 'ifdef_protect'])
     #
     # Called once at the beginning of each run
     def beginFile(self, genOpts):
@@ -249,7 +249,7 @@
                                                  islocal=False,
                                                  iscreate=False,
                                                  isdestroy=False))
-        self.structMembers.append(self.StructMemberData(name=typeName, members=membersInfo))
+        self.structMembers.append(self.StructMemberData(name=typeName, members=membersInfo, ifdef_protect=self.featureExtraProtect))
     #
     # Enum_string_header: Create a routine to convert an enumerated value into a string
     def GenerateEnumStringConversion(self, groupName, value_list):
@@ -258,7 +258,6 @@
         outstring += '{\n'
         outstring += '    switch ((%s)input_value)\n' % groupName
         outstring += '    {\n'
-
         for item in value_list:
             outstring += '        case %s:\n' % item
             outstring += '            return "%s";\n' % item
@@ -268,6 +267,22 @@
         outstring += '}\n'
         return outstring
     #
+    # struct_size_header: build function prototypes for header file
+    def GenerateStructSizeHeader(self):
+        outstring = ''
+        outstring += 'size_t get_struct_chain_size(const void* struct_ptr);\n'
+        for item in self.structMembers:
+            lower_case_name = item.name.lower()
+            if item.ifdef_protect != None:
+                outstring += '#ifdef %s\n' % item.ifdef_protect
+            outstring += 'size_t vk_size_%s(const %s* struct_ptr);\n' % (item.name.lower(), item.name)
+            if item.ifdef_protect != None:
+                outstring += '#endif // %s\n' % item.ifdef_protect
+        outstring += '#ifdef __cplusplus\n'
+        outstring += '}\n'
+        outstring += '#endif'
+        return outstring
+    #
     # Create a helper file and return it as a string
     def OutputDestFile(self):
         out_file_entries = ''
@@ -283,10 +298,16 @@
             out_file_entries += self.enum_output
         elif self.helper_file_type == 'struct_size_header':
             out_file_entries = '\n'
-            out_file_entries += 'Helper File header code\n'
+            out_file_entries += '#ifdef __cplusplus\n'
+            out_file_entries += 'extern "C" {\n'
+            out_file_entries += '#endif\n'
             out_file_entries += '\n'
-            out_file_entries += 'helper file.h \n'
+            out_file_entries += '#include <stdio.h>\n'
+            out_file_entries += '#include <stdlib.h>\n'
+            out_file_entries += '#include <vulkan/vulkan.h>\n'
             out_file_entries += '\n'
+            out_file_entries += '// Function Prototypes\n'
+            out_file_entries += self.GenerateStructSizeHeader()
         elif self.helper_file_type == 'struct_size_source':
             out_file_entries = '\n'
             out_file_entries += 'Helper File source code\n'