You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/06/17 19:27:57 UTC

[plc4x] branch feature/c-code-generation-tagged-unions updated (0d23c5d -> c3d641a)

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a change to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


    from 0d23c5d  - Refactored the code generation to use pointers for complex types and arrays/lists - Worked on the expression builders to correctly access indexed items of lists
     new 65a8c40  - Fixed the last syntax-error issue (for now) in the code-generation of the parser code.
     new c3d641a  - Added checks for the return codes of parsed sub-types - Added NULL-checks after the malloc of complex types

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plc4x/language/c/CLanguageTemplateHelper.java  | 18 ++++++++------
 .../resources/templates/c/pojo-template-c.ftlh     | 28 ++++++++++++++++++----
 .../resources/templates/c/pojo-template-h.ftlh     |  6 +++--
 .../modbus/src/modbus_constants.c                  |  3 +++
 .../generated-sources/modbus/src/modbus_pdu.c      | 23 ++++++++++++++----
 .../src/modbus_pdu_read_file_record_request_item.c |  3 +++
 .../modbus_pdu_read_file_record_response_item.c    |  3 +++
 .../modbus_pdu_write_file_record_request_item.c    |  3 +++
 .../modbus_pdu_write_file_record_response_item.c   |  3 +++
 .../modbus/src/modbus_serial_adu.c                 |  8 ++++++-
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |  8 ++++++-
 .../s7/includes/szl_data_tree_item.h               |  2 +-
 .../plc4c/generated-sources/s7/src/cotp_packet.c   | 13 ++++++++--
 .../generated-sources/s7/src/cotp_parameter.c      |  3 +++
 .../plc4c/generated-sources/s7/src/s7_address.c    |  3 +++
 .../plc4c/generated-sources/s7/src/s7_message.c    | 13 ++++++++--
 .../plc4c/generated-sources/s7/src/s7_parameter.c  | 18 +++++++++++---
 .../s7/src/s7_parameter_user_data_item.c           |  3 +++
 .../plc4c/generated-sources/s7/src/s7_payload.c    | 23 ++++++++++++++----
 .../s7/src/s7_payload_user_data_item.c             | 13 ++++++++--
 .../s7/src/s7_var_payload_data_item.c              |  3 +++
 .../s7/src/s7_var_payload_status_item.c            |  3 +++
 .../s7/src/s7_var_request_parameter_item.c         |  8 ++++++-
 .../generated-sources/s7/src/szl_data_tree_item.c  |  3 +++
 sandbox/plc4c/generated-sources/s7/src/szl_id.c    |  3 +++
 .../plc4c/generated-sources/s7/src/tpkt_packet.c   |  8 ++++++-
 26 files changed, 189 insertions(+), 36 deletions(-)


[plc4x] 02/02: - Added checks for the return codes of parsed sub-types - Added NULL-checks after the malloc of complex types

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit c3d641aeb0e811359509ba56e645cb588006e2b6
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Jun 17 21:27:17 2020 +0200

    - Added checks for the return codes of parsed sub-types
    - Added NULL-checks after the malloc of complex types
---
 .../resources/templates/c/pojo-template-c.ftlh     | 28 ++++++++++++++++++----
 .../resources/templates/c/pojo-template-h.ftlh     |  6 +++--
 .../modbus/src/modbus_constants.c                  |  3 +++
 .../generated-sources/modbus/src/modbus_pdu.c      | 23 ++++++++++++++----
 .../src/modbus_pdu_read_file_record_request_item.c |  3 +++
 .../modbus_pdu_read_file_record_response_item.c    |  3 +++
 .../modbus_pdu_write_file_record_request_item.c    |  3 +++
 .../modbus_pdu_write_file_record_response_item.c   |  3 +++
 .../modbus/src/modbus_serial_adu.c                 |  8 ++++++-
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |  8 ++++++-
 .../s7/includes/szl_data_tree_item.h               |  2 +-
 .../plc4c/generated-sources/s7/src/cotp_packet.c   | 13 ++++++++--
 .../generated-sources/s7/src/cotp_parameter.c      |  3 +++
 .../plc4c/generated-sources/s7/src/s7_address.c    |  3 +++
 .../plc4c/generated-sources/s7/src/s7_message.c    | 13 ++++++++--
 .../plc4c/generated-sources/s7/src/s7_parameter.c  | 18 +++++++++++---
 .../s7/src/s7_parameter_user_data_item.c           |  3 +++
 .../plc4c/generated-sources/s7/src/s7_payload.c    | 23 ++++++++++++++----
 .../s7/src/s7_payload_user_data_item.c             | 13 ++++++++--
 .../s7/src/s7_var_payload_data_item.c              |  3 +++
 .../s7/src/s7_var_payload_status_item.c            |  3 +++
 .../s7/src/s7_var_request_parameter_item.c         |  8 ++++++-
 .../generated-sources/s7/src/szl_data_tree_item.c  |  3 +++
 sandbox/plc4c/generated-sources/s7/src/szl_id.c    |  3 +++
 .../plc4c/generated-sources/s7/src/tpkt_packet.c   |  8 ++++++-
 25 files changed, 178 insertions(+), 29 deletions(-)

diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index 7e20914..9f40667 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -95,6 +95,9 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_${helper.getCTypeName(type.name)}));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 <#if type.getPropertyFields()?has_content>
 
 </#if>
@@ -127,7 +130,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
                 <#else>
       <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
       ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
     }
@@ -144,7 +150,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
                 <#else>
                 <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
       ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
                 <#-- After parsing, update the current position, but only if it's needed -->
@@ -163,7 +172,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
                 <#else>
                 <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
       ${helper.getLanguageTypeNameForField(field)}* _value = NULL;
-      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      plc4c_return_code _res = plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
               <#-- After parsing, update the current position, but only if it's needed -->
@@ -251,7 +263,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
         <#if helper.isSimpleTypeReference(optionalField.type)>
     *${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
         <#else>
-    plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
+    plc4c_return_code _res = plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
+    if(_res != OK) {
+      return _res;
+    }
         </#if>
     (*_message)-><@fieldName baseType=baseType field=optionalField/> = ${optionalField.name};
   }
@@ -291,7 +306,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
             <#else>
             <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
   ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
-  plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+  plc4c_return_code _res = plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+  if(_res != OK) {
+    return _res;
+  }
             </#if>
   (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
             <#break>
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
index dad45b8..e390c73 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
@@ -120,6 +120,8 @@ struct plc4c_${helper.getCTypeName(type.name)} {
             <#list case.propertyFields as caseField>
                 <#if (helper.isSimpleTypeReference(caseField.type) || helper.isEnumField(caseField)) && !helper.isOptionalField(caseField) && !helper.isArrayField(caseField) && !helper.isManualArrayField(caseField)>
       ${helper.getLanguageTypeNameForField(caseField)} ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)}${helper.getTypeSizeForField(caseField)}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if>;
+                <#elseif helper.isArrayField(caseField) || helper.isManualArrayField(caseField)>
+      plc4c_list* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
                 <#else>
       ${helper.getLanguageTypeNameForField(caseField)}* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
                 </#if>
@@ -127,10 +129,10 @@ struct plc4c_${helper.getCTypeName(type.name)} {
     };
         </#list>
   };
-    <#elseif helper.isEnumField(field)>
-  ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)};
     <#elseif (helper.isSimpleTypeReference(field.type) || helper.isEnumField(field)) && !helper.isOptionalField(field) && !helper.isArrayField(field) && !helper.isManualArrayField(field)>
   ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)}${helper.getTypeSizeForField(field)}<#if field.loopType??>${helper.getLoopExpressionSuffix(field)}</#if>;
+    <#elseif helper.isArrayField(field) || helper.isManualArrayField(field)>
+  plc4c_list* ${helper.camelCaseToSnakeCase(field.name)};
     <#else>
   ${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(field.name)};
     </#if>
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
index 733739a..15b15f0 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_constants));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Const Field (modbusTcpDefaultPort)
   uint16_t modbusTcpDefaultPort = plc4c_spi_read_unsigned_int(buf, 16);
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 662755e..f275bea 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -113,6 +113,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (error) (Used as input to a switch field)
   bool error = plc4c_spi_read_bit(buf);
@@ -534,7 +537,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
     uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
     while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
       plc4c_list* _value = NULL;
-      plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -557,7 +563,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
     uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
     while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
       plc4c_list* _value = NULL;
-      plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -580,7 +589,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
     uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
     while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
       plc4c_list* _value = NULL;
-      plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -603,7 +615,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
     uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
     while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
       plc4c_list* _value = NULL;
-      plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
index c679f76..31e6b67 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_it
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (referenceType)
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index 11737e4..686c4d3 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index aded3ab..33b8e9a 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (referenceType)
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index d3f9ace..21f3113 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (referenceType)
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index 7bffd64..c284a6d 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_serial_adu));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (transactionId)
@@ -54,7 +57,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
 
   // Simple Field (pdu)
   plc4c_modbus_read_write_modbus_pdu* pdu;
-  plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
+  plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
+  if(_res != OK) {
+    return _res;
+  }
   (*_message)->pdu = pdu;
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index 2170a37..96d17ab 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_tcp_adu));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (transactionIdentifier)
@@ -52,7 +55,10 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
 
   // Simple Field (pdu)
   plc4c_modbus_read_write_modbus_pdu* pdu;
-  plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
+  plc4c_return_code _res = plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
+  if(_res != OK) {
+    return _res;
+  }
   (*_message)->pdu = pdu;
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h b/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
index 920af6f..2913626 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/szl_data_tree_item.h
@@ -29,7 +29,7 @@ extern "C" {
 struct plc4c_s7_read_write_szl_data_tree_item {
   /* Properties */
   uint16_t item_index;
-  int8_t* mlfb;
+  plc4c_list* mlfb;
   uint16_t module_type_id;
   uint16_t ausbg;
   uint16_t ausbe;
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 04dad6a..075ff24 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -53,6 +53,9 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_packet));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -156,7 +159,10 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
     uint8_t parametersEndPos = plc4c_spi_read_get_pos(buf) + _parametersLength;
     while(plc4c_spi_read_get_pos(buf) < parametersEndPos) {
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(parameters, _value);
       curPos = plc4c_spi_read_get_pos(buf) - startPos;
     }
@@ -171,7 +177,10 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
     if(payload == NULL) {
       return NO_MEMORY;
     }
-    plc4c_s7_read_write_s7_message_parse(buf, &payload);
+    plc4c_return_code _res = plc4c_s7_read_write_s7_message_parse(buf, &payload);
+    if(_res != OK) {
+      return _res;
+    }
     (*_message)->payload = payload;
   }
 
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index 5a2c63d..0d82f29 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -51,6 +51,9 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_parameter));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (parameterType) (Used as input to a switch field)
   uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 27b7895..e5c44a3 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -43,6 +43,9 @@ plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* bu
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_address));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (addressType) (Used as input to a switch field)
   uint8_t addressType = plc4c_spi_read_unsigned_short(buf, 8);
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_message.c b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
index d172a53..328b4be 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_message.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
@@ -49,6 +49,9 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_message));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Const Field (protocolId)
@@ -114,7 +117,10 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
     if(parameter == NULL) {
       return NO_MEMORY;
     }
-    plc4c_s7_read_write_s7_parameter_parse(buf, messageType, &parameter);
+    plc4c_return_code _res = plc4c_s7_read_write_s7_parameter_parse(buf, messageType, &parameter);
+    if(_res != OK) {
+      return _res;
+    }
     (*_message)->parameter = parameter;
   }
 
@@ -125,7 +131,10 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
     if(payload == NULL) {
       return NO_MEMORY;
     }
-    plc4c_s7_read_write_s7_payload_parse(buf, messageType, parameter, &payload);
+    plc4c_return_code _res = plc4c_s7_read_write_s7_payload_parse(buf, messageType, parameter, &payload);
+    if(_res != OK) {
+      return _res;
+    }
     (*_message)->payload = payload;
   }
 
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index 182f2eb..6357736 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -53,6 +53,9 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (parameterType) (Used as input to a switch field)
   uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
@@ -100,7 +103,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -129,7 +135,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -158,7 +167,10 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_parameter_user_data_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_parameter_user_data_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
index 5512c0c..3eab327 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
@@ -43,6 +43,9 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_sp
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter_user_data_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (itemType) (Used as input to a switch field)
   uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index 815f1d5..55b20cb 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -49,6 +49,9 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x04) && (messageType == 0x03)) { /* S7PayloadReadVarResponse */
@@ -64,7 +67,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -83,7 +89,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -102,7 +111,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_var_payload_status_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_var_payload_status_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
@@ -121,7 +133,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_s7_payload_user_data_item_parse(buf, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items, 0)))->s7_parameter_user_data_item_cpu_functions_cpu_function_type, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_s7_payload_user_data_item_parse(buf, ((plc4c_s7_read_write_s7_parameter_user_data_item*) (plc4c_utils_list_get(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items, 0)))->s7_parameter_user_data_item_cpu_functions_cpu_function_type, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index 4da4a54..7a46d20 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -45,6 +45,9 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload_user_data_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Enum field (returnCode)
@@ -60,7 +63,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
 
   // Simple Field (szlId)
   plc4c_s7_read_write_szl_id* szlId;
-  plc4c_s7_read_write_szl_id_parse(buf, (void*) &szlId);
+  plc4c_return_code _res = plc4c_s7_read_write_szl_id_parse(buf, (void*) &szlId);
+  if(_res != OK) {
+    return _res;
+  }
   (*_message)->szl_id = szlId;
 
   // Simple Field (szlIndex)
@@ -95,7 +101,10 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
     for(int curItem = 0; curItem < itemCount; curItem++) {
       bool lastItem = curItem == (itemCount - 1);
       plc4c_list* _value = NULL;
-      plc4c_s7_read_write_szl_data_tree_item_parse(buf, (void*) &_value);
+      plc4c_return_code _res = plc4c_s7_read_write_szl_data_tree_item_parse(buf, (void*) &_value);
+      if(_res != OK) {
+        return _res;
+      }
       plc4c_utils_list_insert_head_value(items, _value);
     }
   }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index e6c8f3f..621ab79 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_data_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Enum field (returnCode)
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
index e3bad0d..420006a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_status_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Enum field (returnCode)
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
index 7855af4..6da1d2a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
@@ -43,6 +43,9 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
   // Discriminator Field (itemType) (Used as input to a switch field)
   uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
@@ -56,7 +59,10 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_
 
   // Simple Field (address)
   plc4c_s7_read_write_s7_address* address;
-  plc4c_s7_read_write_s7_address_parse(buf, (void*) &address);
+  plc4c_return_code _res = plc4c_s7_read_write_s7_address_parse(buf, (void*) &address);
+  if(_res != OK) {
+    return _res;
+  }
   (*_message)->s7_var_request_parameter_item_address_address = address;
   }
 
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
index ef64b69..41b209f 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_data_tree_item));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Simple Field (itemIndex)
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_id.c b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
index 484ba7c..532015d 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_id.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, p
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_id));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Enum field (typeClass)
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index 4a7ce24..324d1f7 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -30,6 +30,9 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
 
   // Pointer to the parsed data structure.
   (*_message) = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
+  if(*_message == NULL) {
+    return NO_MEMORY;
+  }
 
 
   // Const Field (protocolId)
@@ -52,7 +55,10 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
 
   // Simple Field (payload)
   plc4c_s7_read_write_cotp_packet* payload;
-  plc4c_s7_read_write_cotp_packet_parse(buf, (len) - (4), (void*) &payload);
+  plc4c_return_code _res = plc4c_s7_read_write_cotp_packet_parse(buf, (len) - (4), (void*) &payload);
+  if(_res != OK) {
+    return _res;
+  }
   (*_message)->payload = payload;
 
   return OK;


[plc4x] 01/02: - Fixed the last syntax-error issue (for now) in the code-generation of the parser code.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 65a8c4059a3c4e84ba6bb7867b70f530cd49ed79
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Jun 17 21:11:52 2020 +0200

    - Fixed the last syntax-error issue (for now) in the code-generation of the parser code.
---
 .../plc4x/language/c/CLanguageTemplateHelper.java      | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index ab8808a..a3e5bd5 100644
--- a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -140,12 +140,16 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
      * @return true if the access needs to be using pointers
      */
     public boolean requiresPointerAccess(ComplexTypeDefinition typeDefinition, String propertyName) {
-        final Optional<NamedField> typeField = typeDefinition.getFields().stream().filter(field -> field instanceof NamedField).map(field -> (NamedField) field).filter(namedField -> namedField.getName().equals(propertyName)).findFirst();
+        final Optional<NamedField> namedFieldOptional = typeDefinition.getFields().stream().filter(field -> field instanceof NamedField).map(field -> (NamedField) field).filter(namedField -> namedField.getName().equals(propertyName)).findFirst();
         // If the property name refers to a field, check if it's an optional field.
         // If it is, pointer access is required, if not, it's not.
-        if(typeField.isPresent()) {
-            final NamedField namedField = typeField.get();
-            return namedField instanceof OptionalField;
+        if(namedFieldOptional.isPresent()) {
+            final NamedField namedField = namedFieldOptional.get();
+            if(namedField instanceof TypedField) {
+                TypedField typedField = (TypedField) namedField;
+                return !(namedField instanceof EnumField) && (isComplexTypeReference(typedField.getType()));
+            }
+            return false;
         }
         final Optional<Argument> parserArgument = Arrays.stream(typeDefinition.getParserArguments()).filter(argument -> argument.getName().equals(propertyName)).findFirst();
         // If the property name refers to a parser argument, as soon as it's a complex type,
@@ -497,15 +501,15 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             } else {
                 sb.append(getCTypeName(castType.getName()));
             }
-            sb.append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "*" : "").append(") (");
+            sb.append("*) (");
             sb.append(toVariableParseExpression(baseType, field, sourceTerm, parserArguments)).append("))");
             if(vl.getChild() != null) {
                 if(castType.getParentType() != null) {
                     // Change the name of the property to contain the sub-type-prefix.
-                    sb.append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "->" : ".").append(camelCaseToSnakeCase(castType.getName())).append("_");
+                    sb.append("->").append(camelCaseToSnakeCase(castType.getName())).append("_");
                     appendVariableExpressionRest(sb, vl.getChild());
                 } else {
-                    sb.append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "->" : ".");
+                    sb.append("->");
                     appendVariableExpressionRest(sb, vl.getChild());
                 }
             }