# csvtoenum( ) # 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()