From 0829e1a2d1fc1c1d284b6e929a62479cdd01064e Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Wed, 18 Sep 2024 00:58:41 -0400 Subject: [PATCH] Clean up enum code --- compile.c | 3 +-- enums.c | 22 ++++++++-------------- enums.h | 3 +-- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/compile.c b/compile.c index d769bcb..8994845 100644 --- a/compile.c +++ b/compile.c @@ -3811,8 +3811,7 @@ CORD compile_statement_header(env_t *env, ast_t *ast) compile_namespace_header(env, def->name, def->namespace)); } case EnumDef: { - return CORD_all(compile_enum_typedef(env, ast), - compile_enum_declarations(env, ast)); + return compile_enum_header(env, ast); } case LangDef: { auto def = Match(ast, LangDef); diff --git a/enums.c b/enums.c index 538a809..7e2fec6 100644 --- a/enums.c +++ b/enums.c @@ -203,35 +203,29 @@ void compile_enum_def(env_t *env, ast_t *ast) compile_namespace(env, def->name, def->namespace); } -CORD compile_enum_typedef(env_t *env, ast_t *ast) +CORD compile_enum_header(env_t *env, ast_t *ast) { auto def = Match(ast, EnumDef); - CORD full_name = CORD_cat(namespace_prefix(env->libname, env->namespace), def->name); + CORD full_name = CORD_all(namespace_prefix(env->libname, env->namespace), def->name); CORD all_defs = CORD_all("typedef struct ", full_name, "_s ", full_name, "_t;\n"); CORD enum_def = CORD_all("struct ", full_name, "_s {\n" "\tenum { ", full_name, "$null=0, "); for (tag_ast_t *tag = def->tags; tag; tag = tag->next) { enum_def = CORD_all(enum_def, full_name, "$tag$", tag->name); - if (tag->next) enum_def = CORD_cat(enum_def, ", "); + if (tag->next) enum_def = CORD_all(enum_def, ", "); } - enum_def = CORD_cat(enum_def, "} tag;\n" + enum_def = CORD_all(enum_def, "} tag;\n" "union {\n"); for (tag_ast_t *tag = def->tags; tag; tag = tag->next) { CORD field_def = compile_struct_typedef(env, WrapAST(ast, StructDef, .name=CORD_to_const_char_star(CORD_all(def->name, "$", tag->name)), .fields=tag->fields)); all_defs = CORD_all(all_defs, field_def); enum_def = CORD_all(enum_def, full_name, "$", tag->name, "_t $", tag->name, ";\n"); } - enum_def = CORD_cat(enum_def, "};\n};\n"); + enum_def = CORD_all(enum_def, "};\n};\n"); all_defs = CORD_all(all_defs, enum_def); - return all_defs; -} -CORD compile_enum_declarations(env_t *env, ast_t *ast) -{ - auto def = Match(ast, EnumDef); - CORD full_name = CORD_cat(namespace_prefix(env->libname, env->namespace), def->name); - CORD all_defs = CORD_all("extern const TypeInfo ", full_name, ";\n"); + all_defs = CORD_all(all_defs, "extern const TypeInfo ", full_name, ";\n"); for (tag_ast_t *tag = def->tags; tag; tag = tag->next) { all_defs = CORD_all(all_defs, "extern const TypeInfo ", namespace_prefix(env->libname, env->namespace), def->name, "$", tag->name, ";\n"); @@ -240,11 +234,11 @@ CORD compile_enum_declarations(env_t *env, ast_t *ast) for (arg_ast_t *field = tag->fields; field; field = field->next) { type_t *field_t = get_arg_ast_type(env, field); arg_sig = CORD_all(arg_sig, compile_declaration(field_t, CORD_all("$", field->name))); - if (field->next) arg_sig = CORD_cat(arg_sig, ", "); + if (field->next) arg_sig = CORD_all(arg_sig, ", "); } if (arg_sig == CORD_EMPTY) arg_sig = "void"; CORD constructor_def = CORD_all(full_name, "_t ", full_name, "$tagged$", tag->name, "(", arg_sig, ");\n"); - all_defs = CORD_cat(all_defs, constructor_def); + all_defs = CORD_all(all_defs, constructor_def); } } return CORD_all(all_defs, compile_namespace_header(env, def->name, def->namespace)); diff --git a/enums.h b/enums.h index 603c17b..68b03ec 100644 --- a/enums.h +++ b/enums.h @@ -8,7 +8,6 @@ #include "environment.h" void compile_enum_def(env_t *env, ast_t *ast); -CORD compile_enum_typedef(env_t *env, ast_t *ast); -CORD compile_enum_declarations(env_t *env, ast_t *ast); +CORD compile_enum_header(env_t *env, ast_t *ast); // vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0