public String getDataIoTypeNameForTypeReference(TypeReference typeReference) {
        Objects.requireNonNull(typeReference);
        if (typeReference instanceof SimpleTypeReference) {
            SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
            switch (simpleTypeReference.getBaseType()) {
                case BIT:
                    return "bool";
                case BYTE:
                    return "byte";
                case UINT: {
                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
                    if (integerTypeReference.getSizeInBits() <= 8) {
                        return "usint";
                    }
                    if (integerTypeReference.getSizeInBits() <= 16) {
                        return "uint";
                    }
                    if (integerTypeReference.getSizeInBits() <= 32) {
                        return "udint";
                    }
                    if (integerTypeReference.getSizeInBits() <= 64) {
                        return "ulint";
                    }
                    throw new FreemarkerException("Unsupported simple type");
                }
                case INT: {
                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
                    if (integerTypeReference.getSizeInBits() <= 8) {
                        return "sint";
                    }
                    if (integerTypeReference.getSizeInBits() <= 16) {
                        return "int";
                    }
                    if (integerTypeReference.getSizeInBits() <= 32) {
                        return "dint";
                    }
                    if (integerTypeReference.getSizeInBits() <= 64) {
                        return "lint";
                    }
                    throw new FreemarkerException("Unsupported simple type");
                }
                case FLOAT:
                    FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
                    int sizeInBits = floatTypeReference.getSizeInBits();
                    if (sizeInBits <= 32) {
                        return "real";
                    }
                    if (sizeInBits <= 64) {
                        return "lreal";
                    }
                    throw new FreemarkerException("Unsupported real type with " + sizeInBits + " bits.");
                case UFLOAT:
                    throw new FreemarkerException("Unsupported unsigned real type.");
                case STRING:
                case VSTRING:
                    return "char";
                case TIME:
                    return "time";//throw new FreemarkerException("Unsupported time type.");
                case DATE:
                    return "date";//throw new FreemarkerException("Unsupported date type.");
                case DATETIME:
                    return "date_and_time";//throw new FreemarkerException("Unsupported date-time type.");
            }
            throw new FreemarkerException("Unsupported simple type. " + simpleTypeReference.getBaseType());
        } else {
            return getCTypeName(((NonSimpleTypeReference) typeReference).getName());
        }
    }
Converts a given type-reference into a concrete type in C
If it's a complex type, this is trivial, as the typename then follows the usual pattern.
For simple types it's a little more complex as depending on the parameters the concrete type will be different.

@param typeReference type reference
@return c type
code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java