speed-dreams/cmake/splitargn.cmake

187 lines
6.1 KiB
CMake

############################################################################
#
# file : split_argn.cmake
# copyright : (C) 2008 by Mart Kelder
# web : www.speed-dreams.org
# version : $Id$
#
############################################################################
############################################################################
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
############################################################################
# @file Generic macro argument parser
# @author Mart Kelder
# @version $Id$
# Internal use only : Get the list of specified keywords
MACRO(SPLIT_ARGN_KEYWORDS SAK_RESULT)
SET(SAK_FIRST TRUE)
SET(SAK_FINISHED FALSE)
FOREACH(SAK_ITEM ${ARGN})
IF(NOT SAK_FINISHED)
IF(${SAK_ITEM} STREQUAL ARGUMENTS)
SET(SAK_FINISHED TRUE)
ELSE(${SAK_ITEM} STREQUAL ARGUMENTS)
STRING(REPLACE "," ";" SAK_ITEMLIST ${SAK_ITEM})
LIST(GET SAK_ITEMLIST 0 SAK_KEYWORD)
IF(SAK_FIRST)
SET(${SAK_RESULT} ${SAK_KEYWORD})
SET(SAK_FIRST FALSE)
ELSE(SAK_FIRST)
SET(${SAK_RESULT} ${${SAK_RESULT}} ${SAK_KEYWORD})
ENDIF(SAK_FIRST)
ENDIF(${SAK_ITEM} STREQUAL ARGUMENTS)
ENDIF(NOT SAK_FINISHED)
ENDFOREACH(SAK_ITEM ${ARGN})
ENDMACRO(SPLIT_ARGN_KEYWORDS SAK_RESULT)
# Internal use only : Initialize output vars for each keyword
MACRO(SPLIT_ARGN_CLEAN_VARS)
SET(SACI_FINISHED FALSE)
FOREACH(SACI_ITEM ${ARGN})
IF(NOT SACI_FINISHED)
IF(${SACI_ITEM} STREQUAL ARGUMENTS)
SET(SACI_FINISHED TRUE)
ELSE(${SACI_ITEM} STREQUAL ARGUMENTS)
STRING(REPLACE "," ";" SACI_ITEMLIST ${SACI_ITEM})
LIST(GET SACI_ITEMLIST 3 SACI_ISVARNAME)
SET(${SACI_ISVARNAME} FALSE)
LIST(GET SACI_ITEMLIST 4 SACI_VARNAME)
SET(${SACI_VARNAME})
ENDIF(${SACI_ITEM} STREQUAL ARGUMENTS)
ENDIF(NOT SACI_FINISHED)
ENDFOREACH(SACI_ITEM ${ARGN})
ENDMACRO(SPLIT_ARGN_CLEAN_VARS)
# Internal use only : Parse args for a given keyword
MACRO(SPLIT_ARGN_GET_KEYWORD SAG_KEYWORD SAG_FOUND SAG_KEYWORDNAME SAG_MINCOUNT SAG_MAXCOUNT SAG_ISVARNAME SAG_VARNAME)
SET(${SAG_FOUND} FALSE)
SET(SAG_FINISHED FALSE)
FOREACH(SAG_ITEM ${ARGN})
IF(NOT SAG_FINISHED)
IF(${SAG_ITEM} STREQUAL ARGUMENTS)
SET(SAG_FINISHED TRUE)
ELSE(${SAG_ITEM} STREQUAL ARGUMENTS)
STRING(REPLACE "," ";" SAG_ITEMLIST ${SAG_ITEM})
LIST(GET SAG_ITEMLIST 0 SAG_ITEMKEYWORD)
IF(${SAG_KEYWORD} STREQUAL ${SAG_ITEMKEYWORD})
SET(${SAG_FOUND} TRUE)
LIST(GET SAG_ITEMLIST 0 ${SAG_KEYWORDNAME})
LIST(GET SAG_ITEMLIST 1 ${SAG_MINCOUNT})
LIST(GET SAG_ITEMLIST 2 ${SAG_MAXCOUNT})
LIST(GET SAG_ITEMLIST 3 ${SAG_ISVARNAME})
LIST(GET SAG_ITEMLIST 4 ${SAG_VARNAME})
ENDIF(${SAG_KEYWORD} STREQUAL ${SAG_ITEMKEYWORD})
ENDIF(${SAG_ITEM} STREQUAL ARGUMENTS)
ENDIF(NOT SAG_FINISHED)
ENDFOREACH(SAG_ITEM ${ARGN})
ENDMACRO(SPLIT_ARGN_GET_KEYWORD SAG_KEYWORD SAG_FOUND SAG_KEYWORDNAME SAG_MINCOUNT SAG_MAXCOUNT SAG_ISVARNAME SAG_VARNAME)
# Internal use only : Test if a string is a keyword
MACRO(SPLIT_ARGN_IS_KEYWORD SAG_KEYWORDS SAG_ITEM SAG_RESULT)
LIST(FIND ${SAG_KEYWORDS} ${SAG_ITEM} SAG_FIND)
IF(${SAG_FIND} LESS 0)
SET(${SAG_RESULT} FALSE)
ELSE(${SAG_FIND} LESS 0)
SET(${SAG_RESULT} TRUE)
ENDIF(${SAG_FIND} LESS 0)
ENDMACRO(SPLIT_ARGN_IS_KEYWORD SAG_KEYWORDS SAG_ITEM)
# The argument parser
MACRO(SPLIT_ARGN)
SPLIT_ARGN_KEYWORDS(SA_KEYWORDS ${ARGN})
SPLIT_ARGN_CLEAN_VARS(${ARGN})
SET(SA_EXPECT_KEYWORD TRUE)
SET(SA_EXPECT_VALUE FALSE)
SET(SA_START FALSE)
#Loop through list
FOREACH(SA_ITEM ${ARGN})
IF(NOT SA_START)
IF(${SA_ITEM} STREQUAL ARGUMENTS)
SET(SA_START TRUE)
ENDIF(${SA_ITEM} STREQUAL ARGUMENTS)
ELSE(NOT SA_START)
#Check if the current item is a keyword
SPLIT_ARGN_IS_KEYWORD(SA_KEYWORDS ${SA_ITEM} SA_ISKEYWORD)
IF(SA_ISKEYWORD)
#Check if it is what we expect
IF(NOT SA_EXPECT_KEYWORD)
MESSAGE(ERROR ": Unexpected keyword in SPLIT_ARGN, got \"${SA_ITEM}\".")
ELSE(NOT SA_EXPECT_KEYWORD)
#Save information about the keyword
SPLIT_ARGN_GET_KEYWORD(${SA_ITEM} SA_KEYWORD_FOUND SA_CUR_KEYWORD SA_CUR_MINCOUNT SA_CUR_MAXCOUNT SA_CUR_ISVARNAME SA_CUR_VARNAME ${ARGN})
IF(SA_KEYWORD_FOUND)
SET(SA_CUR_INDEX 0)
SET(${SA_CUR_VARNAME})
SET(${SA_CUR_ISVARNAME} FALSE)
ELSE(SA_KEYWORD_FOUND)
MESSAGE(ERROR ": Got keyword, but didn't found information about \"${SA_ITEM}\"")
ENDIF(SA_KEYWORD_FOUND)
ENDIF(NOT SA_EXPECT_KEYWORD)
ELSE(SA_ISKEYWORD)
#Check if it is what we expect
IF(NOT SA_EXPECT_VALUE)
MESSAGE(ERROR ": Unexpected value in SPLIT_ARGN, got \"${SA_ITEM}\".")
ELSE(NOT SA_EXPECT_VALUE)
#Save this item to the list
SET(${SA_CUR_VARNAME} ${${SA_CUR_VARNAME}} ${SA_ITEM})
#Increase index
MATH(EXPR SA_CUR_INDEX_TMP "${SA_CUR_INDEX}+1")
SET(SA_CUR_INDEX ${SA_CUR_INDEX_TMP})
ENDIF(NOT SA_EXPECT_VALUE)
ENDIF(SA_ISKEYWORD)
#Check what to expect from the next element
IF(${SA_CUR_INDEX} LESS ${SA_CUR_MINCOUNT})
SET(SA_EXPECT_KEYWORD FALSE)
SET(SA_EXPECT_VALUE TRUE)
ELSE(${SA_CUR_INDEX} LESS ${SA_CUR_MINCOUNT})
SET(${SA_CUR_ISVARNAME} TRUE)
SET(SA_EXPECT_KEYWORD TRUE)
IF(${SA_CUR_INDEX} LESS ${SA_CUR_MAXCOUNT} OR ${SA_CUR_MAXCOUNT} LESS 0)
SET(SA_EXPECT_VALUE TRUE)
ELSE(${SA_CUR_INDEX} LESS ${SA_CUR_MAXCOUNT} OR ${SA_CUR_MAXCOUNT} LESS 0)
SET(SA_EXPECT_VALUE FALSE)
ENDIF(${SA_CUR_INDEX} LESS ${SA_CUR_MAXCOUNT} OR ${SA_CUR_MAXCOUNT} LESS 0)
ENDIF(${SA_CUR_INDEX} LESS ${SA_CUR_MINCOUNT})
ENDIF(NOT SA_START)
ENDFOREACH(SA_ITEM ${ARGN})
IF(SA_START AND NOT SA_EXPECT_KEYWORD)
#Didn't get all the expected values of the last keyword
MESSAGE(ERROR ": Missing values at the end in SPLIT_ARGN.")
ENDIF(SA_START AND NOT SA_EXPECT_KEYWORD)
ENDMACRO(SPLIT_ARGN)