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 18:27:18 UTC

[plc4x] branch feature/c-code-generation-tagged-unions updated: - 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

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


The following commit(s) were added to refs/heads/feature/c-code-generation-tagged-unions by this push:
     new 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
0d23c5d is described below

commit 0d23c5d2d27adbbf8f343d54446d4c74d573a790
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Jun 17 20:27:09 2020 +0200

    - 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
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |  52 +++++++
 .../plc4x/language/c/CLanguageTemplateHelper.java  |  83 +++++++----
 .../resources/templates/c/pojo-template-c.ftlh     |  40 +++---
 .../resources/templates/c/pojo-template-h.ftlh     |  12 +-
 sandbox/plc4c/api/include/plc4c/utils/list.h       |   2 +
 .../generated-sources/modbus/includes/modbus_pdu.h |  30 ++--
 .../modbus_pdu_read_file_record_response_item.h    |   2 +-
 .../modbus_pdu_write_file_record_request_item.h    |   2 +-
 .../modbus_pdu_write_file_record_response_item.h   |   2 +-
 .../modbus/includes/modbus_serial_adu.h            |   2 +-
 .../modbus/includes/modbus_tcp_adu.h               |   2 +-
 .../generated-sources/modbus/src/modbus_pdu.c      | 154 +++++++++++++--------
 .../modbus_pdu_read_file_record_response_item.c    |   9 +-
 .../modbus_pdu_write_file_record_request_item.c    |   9 +-
 .../modbus_pdu_write_file_record_response_item.c   |   9 +-
 .../modbus/src/modbus_serial_adu.c                 |   2 +-
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |   2 +-
 .../generated-sources/s7/includes/cotp_packet.h    |   2 +-
 .../generated-sources/s7/includes/cotp_parameter.h |   2 +-
 .../generated-sources/s7/includes/s7_parameter.h   |   6 +-
 .../generated-sources/s7/includes/s7_payload.h     |   8 +-
 .../s7/includes/s7_payload_user_data_item.h        |   4 +-
 .../s7/includes/s7_var_payload_data_item.h         |   2 +-
 .../s7/includes/s7_var_request_parameter_item.h    |   2 +-
 .../s7/includes/szl_data_tree_item.h               |   2 +-
 .../generated-sources/s7/includes/tpkt_packet.h    |   2 +-
 .../plc4c/generated-sources/s7/src/cotp_packet.c   |  11 +-
 .../generated-sources/s7/src/cotp_parameter.c      |  10 +-
 .../plc4c/generated-sources/s7/src/s7_parameter.c  |  36 +++--
 .../plc4c/generated-sources/s7/src/s7_payload.c    |  56 ++++----
 .../s7/src/s7_payload_user_data_item.c             |  14 +-
 .../s7/src/s7_var_payload_data_item.c              |  10 +-
 .../s7/src/s7_var_request_parameter_item.c         |   2 +-
 .../generated-sources/s7/src/szl_data_tree_item.c  |  10 +-
 .../plc4c/generated-sources/s7/src/tpkt_packet.c   |   2 +-
 .../spi/include/plc4c/spi/evaluation_helper.h      |   2 +-
 sandbox/plc4c/spi/src/evaluation_helper.c          |   4 +-
 37 files changed, 377 insertions(+), 224 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 7e576a9..093e726 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -286,18 +286,70 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         return field instanceof AbstractField;
     }
 
+    public boolean isArrayField(Field field) {
+        return field instanceof ArrayField;
+    }
+
+    public boolean isChecksumField(Field field) {
+        return field instanceof ChecksumField;
+    }
+
+    public boolean isConstField(Field field) {
+        return field instanceof ConstField;
+    }
+
+    public boolean isDiscriminatorField(Field field) {
+        return field instanceof DiscriminatorField;
+    }
+
     public boolean isEnumField(Field field) {
         return field instanceof EnumField;
     }
 
+    public boolean isImplicitField(Field field) {
+        return field instanceof ImplicitField;
+    }
+
+    public boolean isManualArrayField(Field field) {
+        return field instanceof ManualArrayField;
+    }
+
+    public boolean isNamedField(Field field) {
+        return field instanceof NamedField;
+    }
+
     public boolean isOptionalField(Field field) {
         return field instanceof OptionalField;
     }
 
+    public boolean isPaddingField(Field field) {
+        return field instanceof PaddingField;
+    }
+
+    public boolean isPropertyField(Field field) {
+        return field instanceof PropertyField;
+    }
+
+    public boolean isReservedField(Field field) {
+        return field instanceof ReservedField;
+    }
+
+    public boolean isSimpleField(Field field) {
+        return field instanceof SimpleField;
+    }
+
     public boolean isSwitchField(Field field) {
         return field instanceof SwitchField;
     }
 
+    public boolean isTypedField(Field field) {
+        return field instanceof TypedField;
+    }
+
+    public boolean isVirtualField(Field field) {
+        return field instanceof VirtualField;
+    }
+
     public boolean isCountArrayField(Field field) {
         if(field instanceof ArrayField) {
             ArrayField arrayField = (ArrayField) field;
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 7cec423..ab8808a 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
@@ -480,7 +480,6 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
         VariableLiteral vl = (VariableLiteral) term;
         if("CAST".equals(vl.getName())) {
 
-            StringBuilder sb = new StringBuilder();
             if((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
                 throw new RuntimeException("A CAST expression expects exactly two arguments.");
             }
@@ -491,28 +490,25 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             // If we're casting to a sub-type of a discriminated value, we got to cast to the parent
             // type instead and add the name of the sub-type as prefix to the property we're tryging to
             // access next.
-            String castToType;
-            String restExpression;
+            StringBuilder sb = new StringBuilder();
+            sb.append("((plc4c_");
             if(castType.getParentType() != null) {
-                castToType = castType.getParentType().getName();
-                if(vl.getChild() != null) {
-                    // Change the name of the property to contain the sub-type-prefix.
-                    restExpression = "." + camelCaseToSnakeCase(castType.getName()) + "_" + toVariableExpressionRest(vl.getChild());
-                } else {
-                    restExpression = "";
-                }
+                sb.append(getCTypeName(castType.getParentType().getName()));
             } else {
-                castToType = castType.getName();
-                if(vl.getChild() != null) {
-                    restExpression = "." + toVariableExpressionRest(vl.getChild());
+                sb.append(getCTypeName(castType.getName()));
+            }
+            sb.append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "*" : "").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("_");
+                    appendVariableExpressionRest(sb, vl.getChild());
                 } else {
-                    restExpression = "";
+                    sb.append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "->" : ".");
+                    appendVariableExpressionRest(sb, vl.getChild());
                 }
             }
-            sb.append("((plc4c_").append(getCTypeName(castToType)).append(") (")
-                .append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "*" : "")
-                .append(toVariableParseExpression(baseType, field, sourceTerm, parserArguments)).append("))")
-                .append(restExpression);
             return sb.toString();
         }
         // Any name that is full upper-case is considered a function call.
@@ -535,7 +531,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             if (vl.getIndex() != VariableLiteral.NO_INDEX) {
                 sb.append("[").append(vl.getIndex()).append("]");
             }
-            return sb.toString() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
+            if(vl.getChild() != null) {
+                sb.append(".");
+                appendVariableExpressionRest(sb, vl.getChild());
+            }
+            return sb.toString();
         }
 
         final String name = vl.getName();
@@ -587,7 +587,12 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             return sb.toString();
         }
         // Else ... generate a simple access path.
-        return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
+        StringBuilder sb = new StringBuilder(vl.getName());
+        if(vl.getChild() != null) {
+            sb.append(".");
+            appendVariableExpressionRest(sb, vl.getChild());
+        }
+        return sb.toString();
     }
 
     private String toVariableSerializationExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] serialzerArguments) {
@@ -619,7 +624,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                         }
                     }
                     if (isSerializerArg) {
-                        sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+                        sb.append(va.getName());
+                        if(va.getChild() != null) {
+                            sb.append(".");
+                            appendVariableExpressionRest(sb, va.getChild());
+                        }
                     } else if (isTypeArg) {
                         String part = va.getChild().getName();
                         switch (part) {
@@ -698,7 +707,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                             }
                         }
                         if (isSerializerArg) {
-                            sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+                            sb.append(va.getName());
+                            if(va.getChild() != null) {
+                                sb.append(".");
+                                appendVariableExpressionRest(sb, va.getChild());
+                            }
                         } else if (isTypeArg) {
                             String part = va.getChild().getName();
                             switch (part) {
@@ -747,7 +760,12 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             }
         }
         if (isSerializerArg) {
-            return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
+            StringBuilder sb = new StringBuilder(vl.getName());
+            if(vl.getChild() != null) {
+                sb.append(".");
+                appendVariableExpressionRest(sb, vl.getChild());
+            }
+            return sb.toString();
         } else if (isTypeArg) {
             String part = vl.getChild().getName();
             switch (part) {
@@ -772,13 +790,24 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                     return "";
             }
         } else {
-            return "_value." + toVariableExpressionRest(vl);
+            StringBuilder sb = new StringBuilder("_value");
+            appendVariableExpressionRest(sb, vl);
+            return sb.toString();
         }
     }
 
-    private String toVariableExpressionRest(VariableLiteral vl) {
-        return camelCaseToSnakeCase(vl.getName()) + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
-            ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
+    private void appendVariableExpressionRest(StringBuilder sb, VariableLiteral vl) {
+        if(vl.isIndexed()) {
+            sb.insert(0, "plc4c_utils_list_get(");
+            sb.append(camelCaseToSnakeCase(vl.getName()));
+            sb.append(", ").append(vl.getIndex()).append(")");
+        } else {
+            sb.append(camelCaseToSnakeCase(vl.getName()));
+        }
+        if(vl.getChild() != null) {
+            sb.append(".");
+            appendVariableExpressionRest(sb, vl.getChild());
+        }
     }
 
     public int getNumBits(SimpleTypeReference simpleTypeReference) {
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 fd097e1..7e20914 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
@@ -110,7 +110,10 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
   curPos = plc4c_spi_read_get_pos(buf) - startPos;
             </#if>
             <#-- In all other cases do we have to work with a list, that is later converted to an array -->
-  plc4c_list ${arrayField.name};
+  plc4c_list* ${arrayField.name} = malloc(sizeof(plc4c_list));
+  if(${arrayField.name} == NULL) {
+    return NO_MEMORY;
+  }
   {
             <#if helper.isCountArrayField(field)>
     // Count array
@@ -119,15 +122,14 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
       <#if !helper.isSimpleTypeReference(arrayField.type)>bool lastItem = curItem == (itemCount - 1);</#if>
       <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
                 <#if helper.isSimpleTypeReference(arrayField.type)>
-      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
                 <#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_utils_list_insert_head_value(&${arrayField.name}, value);
+      ${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_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
     }
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
             <#elseif helper.isLengthArrayField(field)>
@@ -137,13 +139,13 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
     while(plc4c_spi_read_get_pos(buf) < ${arrayField.name}EndPos) {
                 <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
                 <#if helper.isSimpleTypeReference(arrayField.type)>
-      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
                 <#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_utils_list_insert_head_value(&${arrayField.name}, value);
+      ${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_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
                 <#-- After parsing, update the current position, but only if it's needed -->
                 <#if arrayField.loopExpression.contains("curPos")>
@@ -156,13 +158,13 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
     while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)}))) {
             <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
                 <#if helper.isSimpleTypeReference(arrayField.type)>
-      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} _value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
                 <#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_utils_list_insert_head_value(&${arrayField.name}, value);
+      ${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_utils_list_insert_head_value(${arrayField.name}, _value);
                 </#if>
               <#-- After parsing, update the current position, but only if it's needed -->
               <#if arrayField.loopExpression.contains("curPos")>
@@ -229,7 +231,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
         <#case "manual">
             <#assign manualField = field>
 
-  // Manual Field (${manualField.name})
+  // Manual Field (${manualField.name})<#-- check if complex -->
   ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, type.parserArguments)});
   (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
         <#break>
@@ -288,7 +290,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
   ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getReadBufferReadMethodCall(simpleField.type)};
             <#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};
+  ${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});
             </#if>
   (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
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 bb86055..dad45b8 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
@@ -118,10 +118,10 @@ struct plc4c_${helper.getCTypeName(type.name)} {
         <#list field.cases as case>
     struct { /* ${case.name} */
             <#list case.propertyFields as caseField>
-                <#if helper.isOptionalField(caseField)>
-      ${helper.getLanguageTypeNameForField(caseField)}* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
-                <#else>
+                <#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>;
+                <#else>
+      ${helper.getLanguageTypeNameForField(caseField)}* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
                 </#if>
             </#list>
     };
@@ -129,10 +129,10 @@ struct plc4c_${helper.getCTypeName(type.name)} {
   };
     <#elseif helper.isEnumField(field)>
   ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)};
-    <#elseif helper.isOptionalField(field)>
-  ${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(field.name)};
-    <#else>
+    <#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>;
+    <#else>
+  ${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(field.name)};
     </#if>
 </#list>
 };
diff --git a/sandbox/plc4c/api/include/plc4c/utils/list.h b/sandbox/plc4c/api/include/plc4c/utils/list.h
index f0df538..2d0724c 100644
--- a/sandbox/plc4c/api/include/plc4c/utils/list.h
+++ b/sandbox/plc4c/api/include/plc4c/utils/list.h
@@ -49,6 +49,8 @@ bool plc4c_utils_list_empty(plc4c_list *list);
 
 bool plc4c_utils_list_contains(plc4c_list *list, plc4c_list_element *element);
 
+bool plc4c_utils_list_get(plc4c_list *list, size_t element_index);
+
 void plc4c_utils_list_insert_head(plc4c_list *list,
                                   plc4c_list_element *element);
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
index 38877d9..b71cbe2 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
@@ -95,14 +95,14 @@ struct plc4c_modbus_read_write_modbus_pdu {
       uint16_t modbus_pdu_read_discrete_inputs_request_quantity;
     };
     struct { /* ModbusPDUReadDiscreteInputsResponse */
-      plc4c_list modbus_pdu_read_discrete_inputs_response_value;
+      plc4c_list* modbus_pdu_read_discrete_inputs_response_value;
     };
     struct { /* ModbusPDUReadCoilsRequest */
       uint16_t modbus_pdu_read_coils_request_starting_address;
       uint16_t modbus_pdu_read_coils_request_quantity;
     };
     struct { /* ModbusPDUReadCoilsResponse */
-      plc4c_list modbus_pdu_read_coils_response_value;
+      plc4c_list* modbus_pdu_read_coils_response_value;
     };
     struct { /* ModbusPDUWriteSingleCoilRequest */
       uint16_t modbus_pdu_write_single_coil_request_address;
@@ -115,7 +115,7 @@ struct plc4c_modbus_read_write_modbus_pdu {
     struct { /* ModbusPDUWriteMultipleCoilsRequest */
       uint16_t modbus_pdu_write_multiple_coils_request_starting_address;
       uint16_t modbus_pdu_write_multiple_coils_request_quantity;
-      plc4c_list modbus_pdu_write_multiple_coils_request_value;
+      plc4c_list* modbus_pdu_write_multiple_coils_request_value;
     };
     struct { /* ModbusPDUWriteMultipleCoilsResponse */
       uint16_t modbus_pdu_write_multiple_coils_response_starting_address;
@@ -126,14 +126,14 @@ struct plc4c_modbus_read_write_modbus_pdu {
       uint16_t modbus_pdu_read_input_registers_request_quantity;
     };
     struct { /* ModbusPDUReadInputRegistersResponse */
-      plc4c_list modbus_pdu_read_input_registers_response_value;
+      plc4c_list* modbus_pdu_read_input_registers_response_value;
     };
     struct { /* ModbusPDUReadHoldingRegistersRequest */
       uint16_t modbus_pdu_read_holding_registers_request_starting_address;
       uint16_t modbus_pdu_read_holding_registers_request_quantity;
     };
     struct { /* ModbusPDUReadHoldingRegistersResponse */
-      plc4c_list modbus_pdu_read_holding_registers_response_value;
+      plc4c_list* modbus_pdu_read_holding_registers_response_value;
     };
     struct { /* ModbusPDUWriteSingleRegisterRequest */
       uint16_t modbus_pdu_write_single_register_request_address;
@@ -146,7 +146,7 @@ struct plc4c_modbus_read_write_modbus_pdu {
     struct { /* ModbusPDUWriteMultipleHoldingRegistersRequest */
       uint16_t modbus_pdu_write_multiple_holding_registers_request_starting_address;
       uint16_t modbus_pdu_write_multiple_holding_registers_request_quantity;
-      plc4c_list modbus_pdu_write_multiple_holding_registers_request_value;
+      plc4c_list* modbus_pdu_write_multiple_holding_registers_request_value;
     };
     struct { /* ModbusPDUWriteMultipleHoldingRegistersResponse */
       uint16_t modbus_pdu_write_multiple_holding_registers_response_starting_address;
@@ -157,10 +157,10 @@ struct plc4c_modbus_read_write_modbus_pdu {
       uint16_t modbus_pdu_read_write_multiple_holding_registers_request_read_quantity;
       uint16_t modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address;
       uint16_t modbus_pdu_read_write_multiple_holding_registers_request_write_quantity;
-      plc4c_list modbus_pdu_read_write_multiple_holding_registers_request_value;
+      plc4c_list* modbus_pdu_read_write_multiple_holding_registers_request_value;
     };
     struct { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
-      plc4c_list modbus_pdu_read_write_multiple_holding_registers_response_value;
+      plc4c_list* modbus_pdu_read_write_multiple_holding_registers_response_value;
     };
     struct { /* ModbusPDUMaskWriteHoldingRegisterRequest */
       uint16_t modbus_pdu_mask_write_holding_register_request_reference_address;
@@ -176,19 +176,19 @@ struct plc4c_modbus_read_write_modbus_pdu {
       uint16_t modbus_pdu_read_fifo_queue_request_fifo_pointer_address;
     };
     struct { /* ModbusPDUReadFifoQueueResponse */
-      plc4c_list modbus_pdu_read_fifo_queue_response_fifo_value;
+      plc4c_list* modbus_pdu_read_fifo_queue_response_fifo_value;
     };
     struct { /* ModbusPDUReadFileRecordRequest */
-      plc4c_list modbus_pdu_read_file_record_request_items;
+      plc4c_list* modbus_pdu_read_file_record_request_items;
     };
     struct { /* ModbusPDUReadFileRecordResponse */
-      plc4c_list modbus_pdu_read_file_record_response_items;
+      plc4c_list* modbus_pdu_read_file_record_response_items;
     };
     struct { /* ModbusPDUWriteFileRecordRequest */
-      plc4c_list modbus_pdu_write_file_record_request_items;
+      plc4c_list* modbus_pdu_write_file_record_request_items;
     };
     struct { /* ModbusPDUWriteFileRecordResponse */
-      plc4c_list modbus_pdu_write_file_record_response_items;
+      plc4c_list* modbus_pdu_write_file_record_response_items;
     };
     struct { /* ModbusPDUReadExceptionStatusRequest */
     };
@@ -205,12 +205,12 @@ struct plc4c_modbus_read_write_modbus_pdu {
       uint16_t modbus_pdu_get_com_event_log_response_status;
       uint16_t modbus_pdu_get_com_event_log_response_event_count;
       uint16_t modbus_pdu_get_com_event_log_response_message_count;
-      plc4c_list modbus_pdu_get_com_event_log_response_events;
+      plc4c_list* modbus_pdu_get_com_event_log_response_events;
     };
     struct { /* ModbusPDUReportServerIdRequest */
     };
     struct { /* ModbusPDUReportServerIdResponse */
-      plc4c_list modbus_pdu_report_server_id_response_value;
+      plc4c_list* modbus_pdu_report_server_id_response_value;
     };
     struct { /* ModbusPDUReadDeviceIdentificationRequest */
     };
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
index 142f84b..b1d8fe9 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_read_file_record_response_item.h
@@ -29,7 +29,7 @@ extern "C" {
 struct plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item {
   /* Properties */
   uint8_t reference_type;
-  plc4c_list data;
+  plc4c_list* data;
 };
 typedef struct plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
index b6d0f89..c5a33f9 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_request_item.h
@@ -31,7 +31,7 @@ struct plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item {
   uint8_t reference_type;
   uint16_t file_number;
   uint16_t record_number;
-  plc4c_list record_data;
+  plc4c_list* record_data;
 };
 typedef struct plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
index 5a9316a..6f95ed3 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu_write_file_record_response_item.h
@@ -31,7 +31,7 @@ struct plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item {
   uint8_t reference_type;
   uint16_t file_number;
   uint16_t record_number;
-  plc4c_list record_data;
+  plc4c_list* record_data;
 };
 typedef struct plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
index cf97b06..308c722 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
@@ -32,7 +32,7 @@ struct plc4c_modbus_read_write_modbus_serial_adu {
   uint16_t transaction_id;
   uint16_t length;
   uint8_t address;
-  plc4c_modbus_read_write_modbus_pdu pdu;
+  plc4c_modbus_read_write_modbus_pdu* pdu;
 };
 typedef struct plc4c_modbus_read_write_modbus_serial_adu plc4c_modbus_read_write_modbus_serial_adu;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
index 61418c1..aa3ae1f 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
@@ -35,7 +35,7 @@ struct plc4c_modbus_read_write_modbus_tcp_adu {
   uint16_t transaction_identifier;
   uint16_t protocol_identifier;
   uint8_t unit_identifier;
-  plc4c_modbus_read_write_modbus_pdu pdu;
+  plc4c_modbus_read_write_modbus_pdu* pdu;
 };
 typedef struct plc4c_modbus_read_write_modbus_tcp_adu plc4c_modbus_read_write_modbus_tcp_adu;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 3f185c9..662755e 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -145,15 +145,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_discrete_inputs_response_value = value;
@@ -176,15 +178,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_coils_response_value = value;
@@ -228,15 +232,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_write_multiple_coils_request_value = value;
@@ -270,15 +276,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_input_registers_response_value = value;
@@ -301,15 +309,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_holding_registers_response_value = value;
@@ -353,15 +363,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_write_multiple_holding_registers_request_value = value;
@@ -404,15 +416,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
@@ -424,15 +438,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
@@ -486,15 +502,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (fifoValue)
-  plc4c_list fifoValue;
+  plc4c_list* fifoValue = malloc(sizeof(plc4c_list));
+  if(fifoValue == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = fifoCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
-      plc4c_utils_list_insert_head_value(&fifoValue, &value);
-      plc4c_utils_list_insert_head_value(&fifoValue, &value);
+      uint16_t _value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(fifoValue, &_value);
     }
   }
   (*_message)->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
@@ -506,15 +524,18 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _itemsLength = byteCount;
     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_utils_list_insert_head_value(&items, value);
+      plc4c_list* _value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->modbus_pdu_read_file_record_request_items = items;
@@ -526,15 +547,18 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _itemsLength = byteCount;
     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_utils_list_insert_head_value(&items, value);
+      plc4c_list* _value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->modbus_pdu_read_file_record_response_items = items;
@@ -546,15 +570,18 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _itemsLength = byteCount;
     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_utils_list_insert_head_value(&items, value);
+      plc4c_list* _value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->modbus_pdu_write_file_record_request_items = items;
@@ -566,15 +593,18 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _itemsLength = byteCount;
     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_utils_list_insert_head_value(&items, value);
+      plc4c_list* _value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->modbus_pdu_write_file_record_response_items = items;
@@ -622,15 +652,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (events)
-  plc4c_list events;
+  plc4c_list* events = malloc(sizeof(plc4c_list));
+  if(events == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = (byteCount) - (6);
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&events, &value);
-      plc4c_utils_list_insert_head_value(&events, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(events, &_value);
     }
   }
   (*_message)->modbus_pdu_get_com_event_log_response_events = events;
@@ -644,15 +676,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
 
   // Array field (value)
-  plc4c_list value;
+  plc4c_list* value = malloc(sizeof(plc4c_list));
+  if(value == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = byteCount;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&value, &value);
-      plc4c_utils_list_insert_head_value(&value, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(value, &_value);
     }
   }
   (*_message)->modbus_pdu_report_server_id_response_value = value;
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 6b582e0..11737e4 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
@@ -40,14 +40,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
   (*_message)->reference_type = referenceType;
 
   // Array field (data)
-  plc4c_list data;
+  plc4c_list* data = malloc(sizeof(plc4c_list));
+  if(data == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _dataLength = (dataLength) - (1);
     uint8_t dataEndPos = plc4c_spi_read_get_pos(buf) + _dataLength;
     while(plc4c_spi_read_get_pos(buf) < dataEndPos) {
-      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
-      plc4c_utils_list_insert_head_value(&data, &value);
+      uint16_t _value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(data, &_value);
     }
   }
   (*_message)->data = data;
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 d1ef483..aded3ab 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
@@ -48,14 +48,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
   uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Array field (recordData)
-  plc4c_list recordData;
+  plc4c_list* recordData = malloc(sizeof(plc4c_list));
+  if(recordData == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _recordDataLength = (recordLength) * (2);
     uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
     while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
-      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
-      plc4c_utils_list_insert_head_value(&recordData, &value);
+      uint16_t _value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(recordData, &_value);
     }
   }
   (*_message)->record_data = recordData;
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 bbcfc0a..d3f9ace 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
@@ -48,14 +48,17 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
   uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Array field (recordData)
-  plc4c_list recordData;
+  plc4c_list* recordData = malloc(sizeof(plc4c_list));
+  if(recordData == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _recordDataLength = (recordLength) * (2);
     uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
     while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
-      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
-      plc4c_utils_list_insert_head_value(&recordData, &value);
+      uint16_t _value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(recordData, &_value);
     }
   }
   (*_message)->record_data = recordData;
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 37bc4cb..7bffd64 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -53,7 +53,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
   (*_message)->address = address;
 
   // Simple Field (pdu)
-  plc4c_modbus_read_write_modbus_pdu pdu;
+  plc4c_modbus_read_write_modbus_pdu* pdu;
   plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
   (*_message)->pdu = pdu;
 
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 5756ede..2170a37 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -51,7 +51,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
   (*_message)->unit_identifier = unitIdentifier;
 
   // Simple Field (pdu)
-  plc4c_modbus_read_write_modbus_pdu pdu;
+  plc4c_modbus_read_write_modbus_pdu* pdu;
   plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
   (*_message)->pdu = pdu;
 
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
index 91d4457..c1c1ca0 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
@@ -82,7 +82,7 @@ struct plc4c_s7_read_write_cotp_packet {
       uint8_t cotp_packet_tpdu_error_reject_cause;
     };
   };
-  plc4c_list parameters;
+  plc4c_list* parameters;
   plc4c_s7_read_write_s7_message* payload;
 };
 typedef struct plc4c_s7_read_write_cotp_packet plc4c_s7_read_write_cotp_packet;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
index 62eb8ed..11c9b00 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
@@ -64,7 +64,7 @@ struct plc4c_s7_read_write_cotp_parameter {
       uint8_t cotp_parameter_checksum_crc;
     };
     struct { /* COTPParameterDisconnectAdditionalInformation */
-      plc4c_list cotp_parameter_disconnect_additional_information_data;
+      plc4c_list* cotp_parameter_disconnect_additional_information_data;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
index 1e126c7..f3172a4 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
@@ -60,19 +60,19 @@ struct plc4c_s7_read_write_s7_parameter {
       uint16_t s7_parameter_setup_communication_pdu_length;
     };
     struct { /* S7ParameterReadVarRequest */
-      plc4c_list s7_parameter_read_var_request_items;
+      plc4c_list* s7_parameter_read_var_request_items;
     };
     struct { /* S7ParameterReadVarResponse */
       uint8_t s7_parameter_read_var_response_num_items;
     };
     struct { /* S7ParameterWriteVarRequest */
-      plc4c_list s7_parameter_write_var_request_items;
+      plc4c_list* s7_parameter_write_var_request_items;
     };
     struct { /* S7ParameterWriteVarResponse */
       uint8_t s7_parameter_write_var_response_num_items;
     };
     struct { /* S7ParameterUserData */
-      plc4c_list s7_parameter_user_data_items;
+      plc4c_list* s7_parameter_user_data_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
index 4e893d3..1aa5564 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
@@ -55,16 +55,16 @@ struct plc4c_s7_read_write_s7_payload {
   /* Properties */
   union {
     struct { /* S7PayloadReadVarResponse */
-      plc4c_list s7_payload_read_var_response_items;
+      plc4c_list* s7_payload_read_var_response_items;
     };
     struct { /* S7PayloadWriteVarRequest */
-      plc4c_list s7_payload_write_var_request_items;
+      plc4c_list* s7_payload_write_var_request_items;
     };
     struct { /* S7PayloadWriteVarResponse */
-      plc4c_list s7_payload_write_var_response_items;
+      plc4c_list* s7_payload_write_var_response_items;
     };
     struct { /* S7PayloadUserData */
-      plc4c_list s7_payload_user_data_items;
+      plc4c_list* s7_payload_user_data_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
index a3c427c..aa7e30e 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
@@ -55,13 +55,13 @@ struct plc4c_s7_read_write_s7_payload_user_data_item {
   /* Properties */
   plc4c_s7_read_write_data_transport_error_code return_code;
   plc4c_s7_read_write_data_transport_size transport_size;
-  plc4c_s7_read_write_szl_id szl_id;
+  plc4c_s7_read_write_szl_id* szl_id;
   uint16_t szl_index;
   union {
     struct { /* S7PayloadUserDataItemCpuFunctionReadSzlRequest */
     };
     struct { /* S7PayloadUserDataItemCpuFunctionReadSzlResponse */
-      plc4c_list s7_payload_user_data_item_cpu_function_read_szl_response_items;
+      plc4c_list* s7_payload_user_data_item_cpu_function_read_szl_response_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
index 6783105..e24bb56 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
@@ -33,7 +33,7 @@ struct plc4c_s7_read_write_s7_var_payload_data_item {
   plc4c_s7_read_write_data_transport_error_code return_code;
   plc4c_s7_read_write_data_transport_size transport_size;
   uint16_t data_length;
-  plc4c_list data;
+  plc4c_list* data;
 };
 typedef struct plc4c_s7_read_write_s7_var_payload_data_item plc4c_s7_read_write_s7_var_payload_data_item;
 
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
index 0c83ffa..eb442d3 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
@@ -48,7 +48,7 @@ struct plc4c_s7_read_write_s7_var_request_parameter_item {
   /* Properties */
   union {
     struct { /* S7VarRequestParameterItemAddress */
-      plc4c_s7_read_write_s7_address s7_var_request_parameter_item_address_address;
+      plc4c_s7_read_write_s7_address* s7_var_request_parameter_item_address_address;
     };
   };
 };
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 65a0922..920af6f 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[20];
+  int8_t* mlfb;
   uint16_t module_type_id;
   uint16_t ausbg;
   uint16_t ausbe;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
index 0976125..1774b50 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
@@ -33,7 +33,7 @@ const uint8_t S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID = 0x03;
 struct plc4c_s7_read_write_tpkt_packet {
   /* Properties */
   uint8_t protocol_id;
-  plc4c_s7_read_write_cotp_packet payload;
+  plc4c_s7_read_write_cotp_packet* payload;
 };
 typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
 
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 189d302..04dad6a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -146,15 +146,18 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
 
   // Array field (parameters)
   curPos = plc4c_spi_read_get_pos(buf) - startPos;
-  plc4c_list parameters;
+  plc4c_list* parameters = malloc(sizeof(plc4c_list));
+  if(parameters == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Length array
     uint8_t _parametersLength = (((headerLength) + (1))) - (curPos);
     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_utils_list_insert_head_value(&parameters, value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &_value);
+      plc4c_utils_list_insert_head_value(parameters, _value);
       curPos = plc4c_spi_read_get_pos(buf) - startPos;
     }
   }
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index dfef1a8..5a2c63d 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -86,15 +86,17 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
   if(parameterType == 0xE0) { /* COTPParameterDisconnectAdditionalInformation */
 
   // Array field (data)
-  plc4c_list data;
+  plc4c_list* data = malloc(sizeof(plc4c_list));
+  if(data == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = rest;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      uint8_t value = plc4c_spi_read_unsigned_short(buf, 8);
-      plc4c_utils_list_insert_head_value(&data, &value);
-      plc4c_utils_list_insert_head_value(&data, &value);
+      uint8_t _value = plc4c_spi_read_unsigned_short(buf, 8);
+      plc4c_utils_list_insert_head_value(data, &_value);
     }
   }
   (*_message)->cotp_parameter_disconnect_additional_information_data = data;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index 6225708..182f2eb 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -90,16 +90,18 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = numItems;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_parameter_read_var_request_items = items;
@@ -117,16 +119,18 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = numItems;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_parameter_write_var_request_items = items;
@@ -144,16 +148,18 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer*
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = numItems;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_parameter_user_data_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_parameter_user_data_items = items;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index 252097a..815f1d5 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -54,16 +54,18 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x04) && (messageType == 0x03)) { /* S7PayloadReadVarResponse */
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
-    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_read_var_response_num_items;
+    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_read_var_response_num_items;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_payload_read_var_response_items = items;
@@ -71,16 +73,18 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x01)) { /* S7PayloadWriteVarRequest */
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
-    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_request_items);
+    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_write_var_request_items);
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_payload_write_var_request_items = items;
@@ -88,16 +92,18 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x03)) { /* S7PayloadWriteVarResponse */
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
-    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_response_num_items;
+    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_write_var_response_num_items;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_s7_var_payload_status_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_payload_write_var_response_items = items;
@@ -105,16 +111,18 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* bu
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x00) && (messageType == 0x07)) { /* S7PayloadUserData */
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
-    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_user_data_items);
+    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter*) (parameter))->s7_parameter_user_data_items);
     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_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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      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_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_payload_user_data_items = items;
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 da87ddf..4da4a54 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
@@ -59,7 +59,7 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
   uint16_t dataLength = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Simple Field (szlId)
-  plc4c_s7_read_write_szl_id szlId;
+  plc4c_s7_read_write_szl_id* szlId;
   plc4c_s7_read_write_szl_id_parse(buf, (void*) &szlId);
   (*_message)->szl_id = szlId;
 
@@ -85,16 +85,18 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
 
 
   // Array field (items)
-  plc4c_list items;
+  plc4c_list* items = malloc(sizeof(plc4c_list));
+  if(items == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = szlItemCount;
     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_utils_list_insert_head_value(&items, value);
-      plc4c_utils_list_insert_head_value(&items, &value);
+      plc4c_list* _value = NULL;
+      plc4c_s7_read_write_szl_data_tree_item_parse(buf, (void*) &_value);
+      plc4c_utils_list_insert_head_value(items, _value);
     }
   }
   (*_message)->s7_payload_user_data_item_cpu_function_read_szl_response_items = items;
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 f827c4a..e6c8f3f 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
@@ -45,15 +45,17 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
   (*_message)->data_length = dataLength;
 
   // Array field (data)
-  plc4c_list data;
+  plc4c_list* data = malloc(sizeof(plc4c_list));
+  if(data == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = ((plc4c_s7_read_write_data_transport_size_get_size_in_bits) ? plc4c_spi_evaluation_helper_ceil((dataLength) / (8.0)) : dataLength);
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&data, &value);
-      plc4c_utils_list_insert_head_value(&data, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(data, &_value);
     }
   }
   (*_message)->data = data;
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 db826a5..7855af4 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
@@ -55,7 +55,7 @@ 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* address;
   plc4c_s7_read_write_s7_address_parse(buf, (void*) &address);
   (*_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 a8be5e5..ef64b69 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
@@ -37,15 +37,17 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
   (*_message)->item_index = itemIndex;
 
   // Array field (mlfb)
-  plc4c_list mlfb;
+  plc4c_list* mlfb = malloc(sizeof(plc4c_list));
+  if(mlfb == NULL) {
+    return NO_MEMORY;
+  }
   {
     // Count array
     uint8_t itemCount = 20;
     for(int curItem = 0; curItem < itemCount; curItem++) {
       
-      int8_t value = plc4c_spi_read_byte(buf, 8);
-      plc4c_utils_list_insert_head_value(&mlfb, &value);
-      plc4c_utils_list_insert_head_value(&mlfb, &value);
+      int8_t _value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(mlfb, &_value);
     }
   }
   (*_message)->mlfb = mlfb;
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index c83283e..4a7ce24 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -51,7 +51,7 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
   uint16_t len = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Simple Field (payload)
-  plc4c_s7_read_write_cotp_packet payload;
+  plc4c_s7_read_write_cotp_packet* payload;
   plc4c_s7_read_write_cotp_packet_parse(buf, (len) - (4), (void*) &payload);
   (*_message)->payload = payload;
 
diff --git a/sandbox/plc4c/spi/include/plc4c/spi/evaluation_helper.h b/sandbox/plc4c/spi/include/plc4c/spi/evaluation_helper.h
index 32a6d2c..76b75fb 100644
--- a/sandbox/plc4c/spi/include/plc4c/spi/evaluation_helper.h
+++ b/sandbox/plc4c/spi/include/plc4c/spi/evaluation_helper.h
@@ -27,6 +27,6 @@ bool plc4c_spi_evaluation_helper_equals(int a, int b);
 
 double plc4c_spi_evaluation_helper_ceil(double a);
 
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list a);
+uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a);
 
 #endif  // PLC4C_SPI_EVALUATION_HELPER_H_
diff --git a/sandbox/plc4c/spi/src/evaluation_helper.c b/sandbox/plc4c/spi/src/evaluation_helper.c
index 9be479f..a0aff22 100644
--- a/sandbox/plc4c/spi/src/evaluation_helper.c
+++ b/sandbox/plc4c/spi/src/evaluation_helper.c
@@ -30,7 +30,7 @@ double plc4c_spi_evaluation_helper_ceil(double a) {
   return ceil(a);
 }
 
-uint8_t plc4c_spi_evaluation_helper_count(plc4c_list a) {
-  return plc4c_utils_list_size(&a);
+uint8_t plc4c_spi_evaluation_helper_count(plc4c_list* a) {
+  return plc4c_utils_list_size(a);
 }