From 8a5e3494e619bb37c3b9aa6044b642d11ae0f040 Mon Sep 17 00:00:00 2001 From: Kyler Date: Sat, 29 Nov 2025 15:15:24 -0700 Subject: [PATCH] implemented bitwise and, not, or, and xor --- SLS_C/src/builtin.c | 315 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 307 insertions(+), 8 deletions(-) diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index fd21f99..e7f84c5 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -1094,23 +1094,322 @@ Boolean builtin_atan2(InterpreterState *interpreter_state) { } Boolean builtin_bitand(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPES; + (void)af; + (void)bf; + + if (type & NUMERIC_FLOAT) + return FALSE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_SIGNED && type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I64, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I32, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I16, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_SIGNED) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I8, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U64, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U32, + .value = bi & ai, + }, + }); + } else if (type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U16, + .value = bi & ai, + }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U8, + .value = bi & ai, + }, + }); + } } Boolean builtin_bitnot(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPE; + (void)af; + + if (type & NUMERIC_FLOAT) + return FALSE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next; + node->next = NULL; + clean_stack(node); + + if (type & NUMERIC_SIGNED && type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I64, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I32, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I16, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_SIGNED) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I8, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U64, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U32, + .value = ~ ai, + }, + }); + } else if (type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U16, + .value = ~ ai, + }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U8, + .value = ~ ai, + }, + }); + } } Boolean builtin_bitor(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPES; + (void)af; + (void)bf; + + if (type & NUMERIC_FLOAT) + return FALSE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_SIGNED && type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I64, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I32, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I16, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_SIGNED) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I8, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U64, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U32, + .value = bi | ai, + }, + }); + } else if (type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U16, + .value = bi | ai, + }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U8, + .value = bi | ai, + }, + }); + } } Boolean builtin_bitxor(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPES; + (void)af; + (void)bf; + + if (type & NUMERIC_FLOAT) + return FALSE; + + StackItem *node = interpreter_state->stack; + interpreter_state->stack = interpreter_state->stack->next->next; + node->next->next = NULL; + clean_stack(node); + + if (type & NUMERIC_SIGNED && type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I64, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I32, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_SIGNED && type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I16, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_SIGNED) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_I8, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_64) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U64, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_32) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U32, + .value = bi ^ ai, + }, + }); + } else if (type & NUMERIC_16) { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U16, + .value = bi ^ ai, + }, + }); + } else { + return push_token(interpreter_state, (Token){ + .type = TOKEN_INTEGER, + .integer_literal = (IntegerLiteral){ + .type = INTEGER_U8, + .value = bi ^ ai, + }, + }); + } } Boolean builtin_ceil(InterpreterState *interpreter_state) {