66 lines
2.2 KiB
CMake
66 lines
2.2 KiB
CMake
# csvtoenum(<CSV_FILE> <OUT_HEADER> <C_TYPE> <TAKE_COLUMN> <PREFIX_COLUMN>)
|
|
# Example:
|
|
# csvtoenum(myfile.csv outhead.h itemtype_t id ITEM_TYPE_)
|
|
#
|
|
# Will generate a header with:
|
|
# typedef enum {
|
|
# ITEM_TYPE_NULL,
|
|
# ITEM_TYPE_FOO,
|
|
# ...
|
|
# ITEM_TYPE_COUNT,
|
|
# } itemtype_t;
|
|
|
|
function(csvtoenum CSV_FILE OUT_HEADER C_TYPE TAKE_COLUMN PREFIX_COLUMN)
|
|
# Read the CSV file
|
|
file(READ "${CSV_FILE}" CSV_CONTENTS)
|
|
string(REPLACE "\r\n" "\n" CSV_CONTENTS "${CSV_CONTENTS}")
|
|
string(REPLACE "\r" "\n" CSV_CONTENTS "${CSV_CONTENTS}")
|
|
string(REGEX REPLACE "\n+$" "" CSV_CONTENTS "${CSV_CONTENTS}")
|
|
string(REPLACE "\n" ";" CSV_LINES "${CSV_CONTENTS}")
|
|
|
|
# Get header row and find column indices
|
|
list(GET CSV_LINES 0 HEADER_ROW)
|
|
string(REPLACE "," ";" HEADER_LIST "${HEADER_ROW}")
|
|
set(COLUMN_INDEX -1)
|
|
set(PREFIX_INDEX -1)
|
|
set(IDX 0)
|
|
foreach(COL ${HEADER_LIST})
|
|
if(COL STREQUAL "${TAKE_COLUMN}")
|
|
set(COLUMN_INDEX ${IDX})
|
|
endif()
|
|
if(COL STREQUAL "${PREFIX_COLUMN}")
|
|
set(PREFIX_INDEX ${IDX})
|
|
endif()
|
|
math(EXPR IDX "${IDX} + 1")
|
|
endforeach()
|
|
if(COLUMN_INDEX EQUAL -1)
|
|
message(FATAL_ERROR "csvtoenum: TAKE_COLUMN '${TAKE_COLUMN}' not found in header of ${CSV_FILE}")
|
|
endif()
|
|
if(PREFIX_INDEX EQUAL -1)
|
|
message(FATAL_ERROR "csvtoenum: PREFIX_COLUMN '${PREFIX_COLUMN}' not found in header of ${CSV_FILE}")
|
|
endif()
|
|
|
|
# Prepare enum entries
|
|
set(ENUM_ENTRIES " ${PREFIX_COLUMN}NULL,")
|
|
set(ROW_IDX 1)
|
|
list(LENGTH CSV_LINES NUM_LINES)
|
|
while(ROW_IDX LESS NUM_LINES)
|
|
list(GET CSV_LINES ${ROW_IDX} ROW)
|
|
string(REPLACE "," ";" ROW_LIST "${ROW}")
|
|
list(LENGTH ROW_LIST ROW_LEN)
|
|
if(ROW_LEN GREATER COLUMN_INDEX)
|
|
list(GET ROW_LIST ${COLUMN_INDEX} ENTRY)
|
|
list(GET ROW_LIST ${PREFIX_INDEX} PREFIX)
|
|
# Only add if ENTRY is not empty
|
|
string(STRIP "${ENTRY}" ENTRY)
|
|
if(NOT ENTRY STREQUAL "")
|
|
set(ENUM_ENTRIES "${ENUM_ENTRIES}\n ${PREFIX}${ENTRY},")
|
|
endif()
|
|
endif()
|
|
math(EXPR ROW_IDX "${ROW_IDX} + 1")
|
|
endwhile()
|
|
set(ENUM_ENTRIES "${ENUM_ENTRIES}\n ${PREFIX_COLUMN}COUNT,")
|
|
|
|
# Write header file
|
|
file(WRITE "${OUT_HEADER}" "/**\n * Auto-generated by csvtoenum.cmake\n * Source: ${CSV_FILE}\n */\n\ntypedef enum {\n${ENUM_ENTRIES}\n} ${C_TYPE};\n")
|
|
endfunction() |