diff --git a/src/cbexigen/datatype_classes.py b/src/cbexigen/datatype_classes.py index de5ae06..0408603 100644 --- a/src/cbexigen/datatype_classes.py +++ b/src/cbexigen/datatype_classes.py @@ -720,6 +720,7 @@ def __get_root_content(self): self.config['root_struct_name'] struct_type = self.parameters['prefix'] + self.config['root_struct_name'] parameter_name = self.config['root_parameter_name'] + use_memset = self.config['use_memset_root_content'] if len(self.analyzer_data.root_elements) > 1: for element in self.analyzer_data.root_elements: @@ -738,6 +739,7 @@ def __get_root_content(self): temp = self.generator.get_template("BaseInitWithUsed.jinja") return temp.render(function_name=function_name, + use_memset=use_memset, struct_type=struct_type, parameter_name=parameter_name, element_comment=comment, @@ -748,6 +750,7 @@ def __get_fragment_content(self): struct_type = f'{self.__schema_prefix}{self.config["fragment_struct_name"]}' parameter_name = self.config['fragment_parameter_name'] function_name = f'{self.config["init_function_prefix"]}{struct_type}' + use_memset = self.config['use_memset_child_elements'] ele = [] arr = [] @@ -768,6 +771,7 @@ def __get_fragment_content(self): # generate init function with arrayLen = 0u and isUsed = 0u temp = self.generator.get_template("BaseInitWithArrayLenAndUsed.jinja") result = temp.render(function_name=function_name, + use_memset=use_memset, struct_type=struct_type, parameter_name=parameter_name, element_comment=comment, @@ -785,6 +789,7 @@ def __get_xmldsig_fragment_content(self): struct_type = f'{self.__schema_prefix}{self.config["xmldsig_fragment_struct_name"]}' parameter_name = self.config['xmldsig_fragment_parameter_name'] function_name = f'{self.config["init_function_prefix"]}{struct_type}' + use_memset = self.config['use_memset_child_elements'] ele = [] arr = [] @@ -805,6 +810,7 @@ def __get_xmldsig_fragment_content(self): # generate init function with arrayLen = 0u and isUsed = 0u temp = self.generator.get_template("BaseInitWithArrayLenAndUsed.jinja") result = temp.render(function_name=function_name, + use_memset=use_memset, struct_type=struct_type, parameter_name=parameter_name, element_comment=comment, @@ -828,6 +834,7 @@ def __get_function_content(self): function_name = self.config['init_function_prefix'] + element.prefixed_type struct_type = element.prefixed_type parameter_name = element.type_short + use_memset = self.config['use_memset_child_elements'] if element.type_short == 'AnonType': function_name = self.config['init_function_prefix'] + element.prefixed_name @@ -856,6 +863,7 @@ def __get_function_content(self): # generate init function with arrayLen = 0u and isUsed = 0u temp = self.generator.get_template("BaseInitWithArrayLenAndUsed.jinja") result += temp.render(function_name=function_name, + use_memset=use_memset, struct_type=struct_type, parameter_name=parameter_name, element_comment=comment, diff --git a/src/cbexigen/tools_config.py b/src/cbexigen/tools_config.py index c34ae7d..23512f3 100644 --- a/src/cbexigen/tools_config.py +++ b/src/cbexigen/tools_config.py @@ -48,6 +48,9 @@ # general c-code style 'c_code_indent_chars': 4, 'c_replace_chars': [' ', '-'], + # usage of memset + 'use_memset_root_content': False, + 'use_memset_child_elements': False, } __CONFIG_MODULE = None @@ -186,6 +189,14 @@ def process_config_parameters(): if hasattr(config_module, 'c_replace_chars'): CONFIG_PARAMS['c_replace_chars'] = config_module.c_replace_chars + ''' usage of memset ''' + # initialization of EXI child elements + if hasattr(config_module, 'use_memset_root_content'): + CONFIG_PARAMS['use_memset_root_content'] = config_module.use_memset_root_content + # initialization of EXI child elements + if hasattr(config_module, 'use_memset_child_elements'): + CONFIG_PARAMS['use_memset_child_elements'] = config_module.use_memset_child_elements + ISO2_SCHEMAS_URL = "https://standards.iso.org/iso/15118/-2/ed-2/en/" ISO20_SCHEMAS_URL = "https://standards.iso.org/iso/15118/-20/ed-1/en/" diff --git a/src/config.py b/src/config.py index 65884f4..a201506 100644 --- a/src/config.py +++ b/src/config.py @@ -126,6 +126,12 @@ # these characters will be replaced by an underscore in generated code c_replace_chars = [' ', '-', '/'] +# Usage of memset for initialization of EXI Documents and Fragments +use_memset_root_content = True + +# Usage of memset for initialization of EXI child elements +use_memset_child_elements = True + # files to be generated c_files_to_generate = { 'exi_error_codes': { @@ -287,7 +293,7 @@ 'c': { 'filename': 'appHand_Datatypes.c', 'identifier': 'APP_HANDSHAKE_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['appHand_Datatypes.h'] } }, @@ -344,7 +350,7 @@ 'c': { 'filename': 'din_msgDefDatatypes.c', 'identifier': 'DIN_MSG_DEF_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['din_msgDefDatatypes.h'] } }, @@ -400,7 +406,7 @@ 'c': { 'filename': 'iso2_msgDefDatatypes.c', 'identifier': 'ISO2_MSG_DEF_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso2_msgDefDatatypes.h'] } }, @@ -456,7 +462,7 @@ 'c': { 'filename': 'iso20_CommonMessages_Datatypes.c', 'identifier': 'ISO20_COMMON_MESSAGES_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso20_CommonMessages_Datatypes.h'] } }, @@ -513,7 +519,7 @@ 'c': { 'filename': 'iso20_AC_Datatypes.c', 'identifier': 'ISO20_AC_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso20_AC_Datatypes.h'] } }, @@ -569,7 +575,7 @@ 'c': { 'filename': 'iso20_DC_Datatypes.c', 'identifier': 'ISO20_DC_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso20_DC_Datatypes.h'] } }, @@ -626,7 +632,7 @@ 'c': { 'filename': 'iso20_WPT_Datatypes.c', 'identifier': 'ISO20_WPT_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso20_WPT_Datatypes.h'] } }, @@ -683,7 +689,7 @@ 'c': { 'filename': 'iso20_ACDP_Datatypes.c', 'identifier': 'ISO20_ACDP_DATATYPES_C', - 'include_std_lib': [], + 'include_std_lib': ['string.h'], 'include_other': ['iso20_ACDP_Datatypes.h'] } }, diff --git a/src/input/code_templates/c/BaseInitWithArrayLenAndUsed.jinja b/src/input/code_templates/c/BaseInitWithArrayLenAndUsed.jinja index 6b771c2..9c24e6c 100644 --- a/src/input/code_templates/c/BaseInitWithArrayLenAndUsed.jinja +++ b/src/input/code_templates/c/BaseInitWithArrayLenAndUsed.jinja @@ -1,5 +1,8 @@ {{ element_comment }} void {{ function_name }}(struct {{ struct_type }}* {{ parameter_name }}) { +{%- if use_memset %} + memset({{ parameter_name }}, 0, sizeof(struct {{ struct_type }})); +{%- else %} {%- if not arrays and not elements %} (void) {{ parameter_name }}; {%- endif %} @@ -9,4 +12,5 @@ void {{ function_name }}(struct {{ struct_type }}* {{ parameter_name }}) { {%- for name in elements %} {{ parameter_name }}->{{ name }}_isUsed = 0u; {%- endfor %} +{%- endif %} } diff --git a/src/input/code_templates/c/BaseInitWithUsed.jinja b/src/input/code_templates/c/BaseInitWithUsed.jinja index 514bae9..d6bb0b3 100644 --- a/src/input/code_templates/c/BaseInitWithUsed.jinja +++ b/src/input/code_templates/c/BaseInitWithUsed.jinja @@ -1,9 +1,13 @@ {{ element_comment }} void {{ function_name }}(struct {{ struct_type }}* {{ parameter_name }}) { +{%- if use_memset %} + memset({{ parameter_name }}, 0, sizeof(struct {{ struct_type }})); +{%- else %} {%- if not elements %} (void) {{ parameter_name }}; {%- endif %} {%- for name in elements %} {{ parameter_name }}->{{ name }}_isUsed = 0u; {%- endfor %} +{%- endif %} }