item
This commit is contained in:
66
cmake/modules/csvtoenum.cmake
Normal file
66
cmake/modules/csvtoenum.cmake
Normal file
@@ -0,0 +1,66 @@
|
||||
# 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()
|
||||
@@ -1,3 +1,8 @@
|
||||
# Copyright (c) 2026 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
if(NOT DEFINED ENV_FILE)
|
||||
message(FATAL_ERROR "ENV_FILE is not set")
|
||||
endif()
|
||||
|
||||
Reference in New Issue
Block a user