aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-13 20:27:19 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-13 20:27:19 -0500
commit853b8e505e007c30fe9ad26ad4f611874f4e7d4f (patch)
treefc48bad52f6a8671789b258e65693beee11d9c20
parentc60b21bf3c5c9341e4ced1d19d3aeed13dcfc778 (diff)
Add secret structs
-rw-r--r--ast.h1
-rw-r--r--compile.c40
-rw-r--r--nextlang.c2
-rw-r--r--parse.c17
4 files changed, 42 insertions, 18 deletions
diff --git a/ast.h b/ast.h
index 3bbe086d..dade182d 100644
--- a/ast.h
+++ b/ast.h
@@ -225,6 +225,7 @@ struct ast_s {
const char *name;
arg_ast_t *fields;
ast_t *namespace;
+ bool secret:1;
} StructDef;
struct {
const char *name;
diff --git a/compile.c b/compile.c
index 554a8556..3b71d6f2 100644
--- a/compile.c
+++ b/compile.c
@@ -289,23 +289,31 @@ CORD compile(env_t *env, ast_t *ast)
}
CORD_appendf(&env->types, "};\n");
- CORD_appendf(&env->funcs,
- "CORD %s__cord(%s_t *obj, bool use_color) {\n"
- "\tif (!obj) return \"%s\";\n"
- "\treturn CORD_asprintf(use_color ? \"\\x1b[0;1m%s\\x1b[m(", def->name, def->name, def->name, def->name);
- for (arg_ast_t *field = def->fields; field; field = field->next) {
- CORD_appendf(&env->funcs, "%s=\\x1b[35m%%r\\x1b[m", field->name);
- if (field->next) env->funcs = CORD_cat(env->funcs, ", ");
- }
- CORD_appendf(&env->funcs, ")\" : \"%s(", def->name);
- for (arg_ast_t *field = def->fields; field; field = field->next) {
- CORD_appendf(&env->funcs, "%s=%%r", field->name);
- if (field->next) env->funcs = CORD_cat(env->funcs, ", ");
+ CORD cord_func = CORD_asprintf("CORD %s__cord(%s_t *obj, bool use_color) {\n"
+ "\tif (!obj) return \"%s\";\n", def->name, def->name, def->name);
+
+ if (def->secret) {
+ CORD_appendf(&cord_func, "\treturn use_color ? \"\\x1b[0;1m%s\\x1b[m(\\x1b[2m...\\x1b[m)\" : \"%s(...)\";\n}",
+ def->name, def->name);
+ } else {
+ CORD_appendf(&cord_func, "\treturn CORD_asprintf(use_color ? \"\\x1b[0;1m%s\\x1b[m(", def->name);
+ for (arg_ast_t *field = def->fields; field; field = field->next) {
+ CORD_appendf(&cord_func, "%s=\\x1b[35m%%r\\x1b[m", field->name);
+ if (field->next) cord_func = CORD_cat(cord_func, ", ");
+ }
+ CORD_appendf(&cord_func, ")\" : \"%s(", def->name);
+ for (arg_ast_t *field = def->fields; field; field = field->next) {
+ CORD_appendf(&cord_func, "%s=%%r", field->name);
+ if (field->next) cord_func = CORD_cat(cord_func, ", ");
+ }
+ cord_func = CORD_cat(cord_func, ")\"");
+ for (arg_ast_t *field = def->fields; field; field = field->next)
+ CORD_appendf(&cord_func, ", __cord(obj->%s)", field->name);
+ cord_func = CORD_cat(cord_func, ");\n}");
}
- env->funcs = CORD_cat(env->funcs, ")\"");
- for (arg_ast_t *field = def->fields; field; field = field->next)
- CORD_appendf(&env->funcs, ", __cord(obj->%s)", field->name);
- env->funcs = CORD_cat(env->funcs, ");\n}");
+
+ env->funcs = CORD_cat(env->funcs, cord_func);
+
return CORD_EMPTY;
}
case EnumDef: {
diff --git a/nextlang.c b/nextlang.c
index d87113a8..0124f834 100644
--- a/nextlang.c
+++ b/nextlang.c
@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
if (getenv("LDLIBS"))
ldlibs = heap_strf("%s %s", ldlibs, getenv("LDLIBS"));
- const char *run = heap_strf("tcc %s %s -run -", cflags, ldlibs);
+ const char *run = heap_strf("tcc -run %s %s -", cflags, ldlibs);
FILE *cc = popen(run, "w");
CORD_put(program, cc);
fclose(cc);
diff --git a/parse.c b/parse.c
index e0690ff8..a74a43e3 100644
--- a/parse.c
+++ b/parse.c
@@ -1400,6 +1400,21 @@ PARSER(parse_struct_def) {
arg_ast_t *fields = parse_args(ctx, &pos, false);
+ whitespace(&pos);
+ bool secret = false;
+ if (match(&pos, ";")) { // Extra flags
+ for (bool done = false; !done; done = true) {
+ whitespace(&pos);
+ if (match_word(&pos, "secret")) {
+ secret = true;
+ done = false;
+ }
+ whitespace(&pos);
+ match(&pos, ",");
+ match(&pos, ";");
+ }
+ }
+
expect_closing(ctx, &pos, ")", "I wasn't able to parse the rest of this struct");
const char *ns_pos = pos;
@@ -1412,7 +1427,7 @@ PARSER(parse_struct_def) {
}
if (!namespace)
namespace = NewAST(ctx->file, pos, pos, Block, .statements=NULL);
- return NewAST(ctx->file, start, pos, StructDef, .name=name, .fields=fields, .namespace=namespace);
+ return NewAST(ctx->file, start, pos, StructDef, .name=name, .fields=fields, .namespace=namespace, .secret=secret);
}
ast_t *parse_enum_def(parse_ctx_t *ctx, const char *pos) {