item
Some checks failed
Build Dusk / run-tests (push) Failing after 1m31s
Build Dusk / build-linux (push) Failing after 1m8s
Build Dusk / build-psp (push) Failing after 1m32s

This commit is contained in:
2026-01-25 15:01:25 -06:00
parent e1d7b7308f
commit f71c271c97
17 changed files with 480 additions and 51 deletions

View 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()