From 2f36271439d8dbf838a6cb1093735be04b2b1f0d Mon Sep 17 00:00:00 2001 From: Kyler Date: Sat, 29 Nov 2025 15:11:42 -0700 Subject: [PATCH] implemented and, not, and or --- SLS_C/src/builtin.c | 68 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index a0a92a4..fd21f99 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -26,6 +26,7 @@ Boolean builtin_equal_to(InterpreterState *interpreter_state); Boolean builtin_not_equal_to(InterpreterState *interpreter_state); Boolean builtin_abs(InterpreterState *interpreter_state); Boolean builtin_acos(InterpreterState *interpreter_state); +Boolean builtin_and(InterpreterState *interpreter_state); Boolean builtin_asin(InterpreterState *interpreter_state); // Boolean builtin_assert(InterpreterState *interpreter_state); // Boolean builtin_at(InterpreterState *interpreter_state); @@ -204,6 +205,12 @@ Boolean load_builtins(InterpreterState *interpreter_state) { if (!hash_table_put_funcs(interpreter_state->functions, SLS_STR("acos"), func)) return FALSE; + func = (FunctionItem *)malloc(sizeof(FunctionItem)); + if (func == NULL) return FALSE; + *func = (FunctionItem){ .type = FUNCTION_BUILTIN, .builtin = *builtin_and}; + if (!hash_table_put_funcs(interpreter_state->functions, SLS_STR("acos"), func)) + return FALSE; + func = (FunctionItem *)malloc(sizeof(FunctionItem)); if (func == NULL) return FALSE; *func = (FunctionItem){ .type = FUNCTION_BUILTIN, .builtin = *builtin_asin}; @@ -1049,6 +1056,27 @@ Boolean builtin_acos(InterpreterState *interpreter_state) { FLOAT_FUNCTION(acos); } +Boolean builtin_and(InterpreterState *interpreter_state) { + NUMERIC_TYPES; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_FLOAT) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ bf && af }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ bi && ai }, + }); + } +} + Boolean builtin_asin(InterpreterState *interpreter_state) { NUMERIC_TYPE; if (af < -1 || af > 1) return FALSE; @@ -1180,13 +1208,45 @@ Boolean builtin_min(InterpreterState *interpreter_state) { } Boolean builtin_not(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_FLOAT) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ !af }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ !ai }, + }); + } } Boolean builtin_or(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPES; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_FLOAT) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ bf || af }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_BOOLEAN, + .boolean_literal = (Boolean){ bi || ai }, + }); + } } Boolean builtin_pick(InterpreterState *interpreter_state) {