diff --git a/SLS_C/src/builtin.c b/SLS_C/src/builtin.c index cd6f897..89ff5bd 100644 --- a/SLS_C/src/builtin.c +++ b/SLS_C/src/builtin.c @@ -1601,8 +1601,78 @@ Boolean builtin_or(InterpreterState *interpreter_state) { } Boolean builtin_pick(InterpreterState *interpreter_state) { - (void)interpreter_state; - return FALSE; + NUMERIC_TYPE; + (void)af; + + if (type & NUMERIC_FLOAT) + return FALSE; + + StackItem *picked = interpreter_state->stack->next; + for (size_t i = 0; i < ai; i++) { + picked = picked->next; + if (picked == NULL) return FALSE; + } + + if (picked == NULL) return FALSE; + + StackItem *node = interpreter_state->stack; + if (node == NULL) return FALSE; + interpreter_state->stack = node->next; + node->next = NULL; + clean_stack(node); + + StackItem *item = (StackItem *)malloc(sizeof(StackItem)); + if (item == NULL) return FALSE; + item->type = picked->type; + item->next = interpreter_state->stack; + + switch (interpreter_state->stack->type) { + case STACK_IDENTIFIER: + item->identifier = picked->identifier; + break; + case STACK_I64: + item->i64 = picked->i64; + break; + case STACK_I32: + item->i32 = picked->i32; + break; + case STACK_I16: + item->i16 = picked->i16; + break; + case STACK_I8: + item->i8 = picked->i8; + break; + case STACK_U64: + item->u64 = picked->u64; + break; + case STACK_U32: + item->u32 = picked->u32; + break; + case STACK_U16: + item->u16 = picked->u16; + break; + case STACK_U8: + item->u8 = picked->u8; + break; + case STACK_FLOAT: + item->f32 = picked->f32; + break; + case STACK_DOUBLE: + item->f64 = picked->f64; + break; + case STACK_CHARACTER: + item->character = picked->character; + break; + case STACK_BOOLEAN: + item->boolean = picked->boolean; + break; + case STACK_TOKEN_STRING: + item->token_string = copy_token_string(picked->token_string); + break; + } + + interpreter_state->stack = item; + return TRUE; } Boolean builtin_rand(InterpreterState *interpreter_state) {