From 7daa8759c9f22e17423c9926ee3c913f76768028 Mon Sep 17 00:00:00 2001 From: Rangi42 Date: Tue, 27 Feb 2024 23:20:06 -0500 Subject: [PATCH] Use `std::variant` for `STRFMT` arguments --- include/asm/format.hpp | 11 ++--------- src/asm/parser.y | 30 +++++++++++++----------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/include/asm/format.hpp b/include/asm/format.hpp index 556450ee..a16682a1 100644 --- a/include/asm/format.hpp +++ b/include/asm/format.hpp @@ -4,6 +4,7 @@ #define RGBDS_FORMAT_SPEC_H #include +#include #include enum FormatState { @@ -29,17 +30,9 @@ struct FormatSpec { bool valid; }; -struct StrFmtArg { - union { - uint32_t number; - char *string; - }; - bool isNumeric; -}; - struct StrFmtArgList { char *format; - std::vector *args; + std::vector> *args; }; struct FormatSpec fmt_NewSpec(void); diff --git a/src/asm/parser.y b/src/asm/parser.y index 5f9eeffe..87c6e685 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -257,7 +257,7 @@ static void strrpl(char *dest, size_t destLen, char const *src, char const *old, static void initStrFmtArgList(struct StrFmtArgList *args) { - args->args = new(std::nothrow) std::vector(); + args->args = new(std::nothrow) std::vector>(); if (!args->args) fatalerror("Failed to allocate memory for STRFMT arg list: %s\n", strerror(errno)); @@ -266,13 +266,15 @@ static void initStrFmtArgList(struct StrFmtArgList *args) static void freeStrFmtArgList(struct StrFmtArgList *args) { free(args->format); - for (struct StrFmtArg &arg : *args->args) - if (!arg.isNumeric) - free(arg.string); + for (std::variant &arg : *args->args) { + if (char **str = std::get_if(&arg); str) + free(*str); + } delete args->args; } -static void strfmt(char *dest, size_t destLen, char const *fmt, std::vector &args) +static void strfmt(char *dest, size_t destLen, char const *fmt, + std::vector> &args) { size_t a = 0; size_t i = 0; @@ -319,13 +321,13 @@ static void strfmt(char *dest, size_t destLen, char const *fmt, std::vector &arg = args[a++]; static char buf[MAXSTRLEN + 1]; - if (arg.isNumeric) - fmt_PrintNumber(buf, sizeof(buf), &spec, arg.number); + if (std::holds_alternative(arg)) + fmt_PrintNumber(buf, sizeof(buf), &spec, std::get(arg)); else - fmt_PrintString(buf, sizeof(buf), &spec, arg.string); + fmt_PrintString(buf, sizeof(buf), &spec, std::get(arg)); i += snprintf(&dest[i], destLen - i, "%s", buf); } @@ -1682,17 +1684,11 @@ strfmt_va_args : %empty { initStrFmtArgList(&$$); } | strfmt_va_args T_COMMA const_no_str { - struct StrFmtArg &arg = $1.args->emplace_back(); - - arg.number = $3; - arg.isNumeric = true; + $1.args->push_back((uint32_t)$3); $$ = $1; } | strfmt_va_args T_COMMA string { - struct StrFmtArg &arg = $1.args->emplace_back(); - - arg.string = strdup($3); - arg.isNumeric = false; + $1.args->push_back(strdup($3)); $$ = $1; } ;