#*******************************************************************************
# Copyright (c) 2011 Profactor GmbH and ACIN
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# SPDX-License-Identifier: EPL-2.0
# 
# Contributors:
#     Gerhard Ebenhofer and Ingo Hegny - initial API and implementation and/or initial documentation
# *******************************************************************************/

MESSAGE("Generate Initfunction")
MESSAGE("Source Dir: ${FORTE_SOURCE_DIR}")
MESSAGE("Binary Dir: ${FORTE_BINARY_DIR}")
FILE(STRINGS ${CMAKE_BINARY_DIR}/../file_list.txt FILE_NAMES)

#######################################################################################
# Create Forte-Executeable with all Functionblocks
#######################################################################################

FOREACH(FILE_NAME ${FILE_NAMES})
  # Do not parse typelib, as it holds the definitions
  STRING(REGEX MATCH  ".*typelib\\.(cpp|h).*" REGEX_STRINGS ${FILE_NAME})
  IF(NOT REGEX_STRINGS)
    STRING(REGEX MATCH  ".*forteinit\\.(cpp|h).*" REGEX_STRINGS ${FILE_NAME})
  ENDIF(NOT REGEX_STRINGS)
  IF(NOT REGEX_STRINGS)
    STRING(REGEX MATCH  ".*stringlist\\.(cpp|h).*" REGEX_STRINGS ${FILE_NAME})
  ENDIF(NOT REGEX_STRINGS)
  IF(NOT REGEX_STRINGS)
    FILE(READ ${FILE_NAME} FILE_CONTENT)
    STRING(REGEX MATCHALL "DEFINE_FIRMWARE_DATATYPE\\(([A-Za-z0-9_]*)" REGEX_STRINGS ${FILE_CONTENT})
    IF(REGEX_STRINGS)
      string(LENGTH ${FILE_NAME} len)
      math(EXPR len ${len}-4)
      string(SUBSTRING ${FILE_NAME} 0 ${len} OUTSTR)
      list(APPEND datatypeIncludeStringBuf ${OUTSTR})
      FOREACH(STR ${REGEX_STRINGS})
        string(LENGTH ${STR} len)
        math(EXPR len ${len}-25)
        string(SUBSTRING ${STR} 25 ${len} OUTSTR)
        list(APPEND datatypeFunctionStringBuf ${OUTSTR})
      ENDFOREACH(STR)
    ENDIF(REGEX_STRINGS)
    STRING(REGEX MATCHALL "DEFINE_FIRMWARE_FB\\(([A-Za-z0-9_]*)" REGEX_STRINGS ${FILE_CONTENT})
    IF(REGEX_STRINGS)
      string(LENGTH ${FILE_NAME} len)
      math(EXPR len ${len}-4)
      string(SUBSTRING ${FILE_NAME} 0 ${len} OUTSTR)
      list(APPEND fbIncludeStringBuf ${OUTSTR})
      FOREACH(STR ${REGEX_STRINGS})
        string(LENGTH ${STR} len)
        math(EXPR len ${len}-19)
        string(SUBSTRING ${STR} 19 ${len} OUTSTR)
        list(APPEND fbFunctionStringBuf ${OUTSTR})
      ENDFOREACH(STR)
    ENDIF(REGEX_STRINGS)
    STRING(REGEX MATCHALL "DEFINE_GENERIC_FIRMWARE_FB\\(([A-Za-z0-9_]*)" REGEX_STRINGS ${FILE_CONTENT})
    IF(REGEX_STRINGS)
      string(LENGTH ${FILE_NAME} len)
      math(EXPR len ${len}-4)
      string(SUBSTRING ${FILE_NAME} 0 ${len} OUTSTR)
      list(APPEND fbIncludeStringBuf ${OUTSTR})
      FOREACH(STR ${REGEX_STRINGS})
        string(LENGTH ${STR} len)
        math(EXPR len ${len}-27)
        string(SUBSTRING ${STR} 27 ${len} OUTSTR)
        list(APPEND fbFunctionStringBuf ${OUTSTR})
      ENDFOREACH(STR)
    ENDIF(REGEX_STRINGS)
    STRING(REGEX MATCHALL "DEFINE_ADAPTER_TYPE\\(([A-Za-z0-9_]*)" REGEX_STRINGS ${FILE_CONTENT})
    IF(REGEX_STRINGS)
      string(LENGTH ${FILE_NAME} len)
      math(EXPR len ${len}-4)
      string(SUBSTRING ${FILE_NAME} 0 ${len} OUTSTR)
      list(APPEND fbIncludeStringBuf ${OUTSTR})
      FOREACH(STR ${REGEX_STRINGS})
        string(LENGTH ${STR} len)
        math(EXPR len ${len}-20)
        string(SUBSTRING ${STR} 20 ${len} OUTSTR)
        list(APPEND fbFunctionStringBuf ${OUTSTR})
      ENDFOREACH(STR)
    ENDIF(REGEX_STRINGS)
  ENDIF(NOT REGEX_STRINGS)
ENDFOREACH(FILE_NAME)

list(SORT datatypeFunctionStringBuf)
list(REMOVE_DUPLICATES datatypeFunctionStringBuf)
SET(DATATYPE_FUNCTION_STRING "")
FOREACH(STR ${datatypeFunctionStringBuf})
  SET(DATATYPE_FUNCTION_STRING "${DATATYPE_FUNCTION_STRING}  CIEC_${STR}::dummyInit();\n")  
ENDFOREACH(STR)

list(SORT datatypeIncludeStringBuf)
list(REMOVE_DUPLICATES datatypeIncludeStringBuf)
SET(DATATYPE_INCLUDE_STRING "")
FOREACH(STR ${datatypeIncludeStringBuf})
  SET(DATATYPE_INCLUDE_STRING "${DATATYPE_INCLUDE_STRING}#include <${STR}.h>\n")
ENDFOREACH(STR)

list(SORT fbFunctionStringBuf)
list(REMOVE_DUPLICATES fbFunctionStringBuf)
SET(FB_FUNCTION_STRING "")
FOREACH(STR ${fbFunctionStringBuf})
  SET(FB_FUNCTION_STRING "${FB_FUNCTION_STRING}  ${STR}::dummyInit();\n")  
ENDFOREACH(STR)

list(SORT fbIncludeStringBuf)
list(REMOVE_DUPLICATES fbIncludeStringBuf)
SET(FB_INCLUDE_STRING "")
FOREACH(STR ${fbIncludeStringBuf})
  SET(FB_INCLUDE_STRING "${FB_INCLUDE_STRING}#include <${STR}.h>\n")
ENDFOREACH(STR)

CONFIGURE_FILE(${FORTE_SOURCE_DIR}/src/forteinit.cpp.in ${FORTE_BINARY_DIR}/forteinit_new.cpp)
CONFIGURE_FILE(${FORTE_SOURCE_DIR}/src/forteinit.h.in ${FORTE_BINARY_DIR}/forteinit_new.h)

# only copy files if different
execute_process( COMMAND ${CMAKE_COMMAND} -E compare_files ${FORTE_BINARY_DIR}/forteinit_new.cpp ${FORTE_BINARY_DIR}/forteinit.cpp RESULT_VARIABLE test_not_successful_cpp OUTPUT_QUIET ERROR_QUIET )
execute_process( COMMAND ${CMAKE_COMMAND} -E compare_files ${FORTE_BINARY_DIR}/forteinit_new.h ${FORTE_BINARY_DIR}/forteinit.h RESULT_VARIABLE test_not_successful_h OUTPUT_QUIET ERROR_QUIET )

IF(test_not_successful_cpp)
  file(REMOVE ${FORTE_BINARY_DIR}/forteinit.cpp)
  file(RENAME ${FORTE_BINARY_DIR}/forteinit_new.cpp ${FORTE_BINARY_DIR}/forteinit.cpp)
ENDIF(test_not_successful_cpp)

IF(test_not_successful_h)
  file(REMOVE ${FORTE_BINARY_DIR}/forteinit.h)
  file(RENAME ${FORTE_BINARY_DIR}/forteinit_new.h ${FORTE_BINARY_DIR}/forteinit.h)
ENDIF(test_not_successful_h)

file(REMOVE ${FORTE_BINARY_DIR}/forteinit_new.cpp)
file(REMOVE ${FORTE_BINARY_DIR}/forteinit_new.h)
