aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-18 00:58:41 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-18 00:58:41 -0400
commit0829e1a2d1fc1c1d284b6e929a62479cdd01064e (patch)
treebe2320a7a3c143c0e518c7d66284606b2df9ccf2
parent92fe16a30823e3492eb44dd5835504602ef010a0 (diff)
Clean up enum code
-rw-r--r--compile.c3
-rw-r--r--enums.c22
-rw-r--r--enums.h3
3 files changed, 10 insertions, 18 deletions
diff --git a/compile.c b/compile.c
index d769bcb2..89948455 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 538a809c..7e2fec67 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 603c17bb..68b03ec9 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