50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
import argparse
|
|
import os
|
|
import csv
|
|
|
|
parser = argparse.ArgumentParser(description="Convert CSV to .h defines")
|
|
parser.add_argument("--csv", required=True, help="Path to CSV file")
|
|
parser.add_argument("--output", required=True, help="Path to output .h file")
|
|
parser.add_argument("--prefix", default="", help="Prefix for each define")
|
|
parser.add_argument("--typedef", required=True, help="Typedef name for the enum")
|
|
parser.add_argument("--take-column", required=True, help="Column name to take the values for the enum for")
|
|
parser.add_argument("--null-entry", default=None, help="Optional name for a NULL/INVALID entry")
|
|
parser.add_argument("--count-entry", default=None, help="Optional name for a COUNT entry")
|
|
args = parser.parse_args()
|
|
|
|
outHeader = "#pragma once\n"
|
|
outHeader += "#include \"dusk.h\"\n\n"
|
|
with open(args.csv, newline='') as csvfile:
|
|
reader = csv.reader(csvfile)
|
|
|
|
headers = next(reader)
|
|
if args.take_column not in headers:
|
|
raise ValueError(f"Column '{args.take_column}' not found in CSV headers")
|
|
take_column_index = headers.index(args.take_column)
|
|
|
|
# Extract entries
|
|
entries = []
|
|
for row in reader:
|
|
value = row[take_column_index]
|
|
clean_define_name = value.replace(" ", "_").upper()
|
|
if clean_define_name in entries:
|
|
continue # Avoid duplicates
|
|
entries.append(clean_define_name)
|
|
|
|
# Gen enum.
|
|
outHeader += f"typedef enum {{\n"
|
|
if args.null_entry == "TRUE":
|
|
outHeader += f" {args.prefix}NULL = 0,\n\n"
|
|
|
|
for entry in entries:
|
|
outHeader += f" {args.prefix}{entry},\n"
|
|
|
|
if args.count_entry == "TRUE":
|
|
outHeader += f"\n {args.prefix}COUNT,\n"
|
|
|
|
outHeader += f"}} {args.typedef};\n\n"
|
|
|
|
# Write to output file (mkdirp if needed)
|
|
os.makedirs(os.path.dirname(args.output), exist_ok=True)
|
|
with open(args.output, 'w') as outFile:
|
|
outFile.write(outHeader) |