From 6cc556279168d7d3c31e00b587660d2811712be2 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 6 Sep 2024 23:01:31 -0400 Subject: Support using text in conditionals --- compile.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/compile.c b/compile.c index 9de6c979..1ebcfb02 100644 --- a/compile.c +++ b/compile.c @@ -1174,11 +1174,17 @@ CORD compile_statement(env_t *env, ast_t *ast) if (cond_t->tag == PointerType) { if (!Match(cond_t, PointerType)->is_optional) code_err(if_->condition, "This pointer will always be non-null, so it should not be used in a conditional."); - } else if (cond_t->tag != BoolType) { - code_err(if_->condition, "Only boolean values and optional pointers can be used in conditionals (this is a %T)", cond_t); + } else if (cond_t->tag != BoolType && cond_t->tag != TextType) { + code_err(if_->condition, "Only boolean values, optional pointers, and text can be used in conditionals (this is a %T)", cond_t); } - CORD code; - CORD_sprintf(&code, "if (%r) %r", compile(env, if_->condition), compile_statement(env, if_->body)); + + CORD condition; + if (cond_t->tag == TextType) + condition = CORD_all("(", compile(env, if_->condition), ").length"); + else + condition = compile(env, if_->condition); + + CORD code = CORD_all("if (", condition, ")", compile_statement(env, if_->body)); if (if_->else_body) code = CORD_all(code, "\nelse ", compile_statement(env, if_->else_body)); return code; @@ -2701,16 +2707,22 @@ CORD compile(env_t *env, ast_t *ast) if (t->tag == VoidType || t->tag == AbortType) code_err(ast, "This expression has a %T type, but it needs to have a real value", t); + CORD condition; + if (get_type(env, if_->condition)->tag == TextType) + condition = CORD_all("(", compile(env, if_->condition), ").length"); + else + condition = compile(env, if_->condition); + type_t *true_type = get_type(env, if_->body); type_t *false_type = get_type(env, if_->else_body); if (true_type->tag == AbortType || true_type->tag == ReturnType) - return CORD_all("({ if (", compile(env, if_->condition), ") ", compile_statement(env, if_->body), + return CORD_all("({ if (", condition, ") ", compile_statement(env, if_->body), "\n", compile(env, if_->else_body), "; })"); else if (false_type->tag == AbortType || false_type->tag == ReturnType) - return CORD_all("({ if (!(", compile(env, if_->condition), ")) ", compile_statement(env, if_->else_body), + return CORD_all("({ if (!(", condition, ")) ", compile_statement(env, if_->else_body), "\n", compile(env, if_->body), "; })"); else - return CORD_all("((", compile(env, if_->condition), ") ? ", + return CORD_all("((", condition, ") ? ", compile(env, if_->body), " : ", compile(env, if_->else_body), ")"); } case Reduction: { -- cgit v1.2.3