From 87bd711079460ad7d864b6e5947a986f51d01af2 Mon Sep 17 00:00:00 2001 From: JGZ_YES Date: Thu, 23 Jul 2026 13:39:43 +0800 Subject: [PATCH] Build B-5 exe and update website --- bin/oraset.exe | Bin 101547 -> 110619 bytes website/download.php | 8 +- website/download/exe/Oraset-B-5.exe | Bin 0 -> 110619 bytes .../source/Oraset-B-5-source/Makefile | 26 + .../source/Oraset-B-5-source/src/main.c | 2425 +++++++++++++++++ website/index.php | 43 +- 6 files changed, 2484 insertions(+), 18 deletions(-) create mode 100644 website/download/exe/Oraset-B-5.exe create mode 100644 website/download/source/Oraset-B-5-source/Makefile create mode 100644 website/download/source/Oraset-B-5-source/src/main.c diff --git a/bin/oraset.exe b/bin/oraset.exe index 5cbcade058b31f71851eb3c15c8ae3775ae6aa79..8d8db0dbfbef352891e4e0a89985e4421ba0e6f2 100644 GIT binary patch literal 110619 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 WX|Tfn_@kWC&kbXdQbpY~`@aB$OY8su literal 101547 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

@d%~&vc|VKAZb1s&d+ax*IjFzUxHbdMFo^%o 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 diff --git a/website/download.php b/website/download.php index 1bb4dcd..cc50125 100644 --- a/website/download.php +++ b/website/download.php @@ -34,13 +34,11 @@

最新版本:B-5

构建日期: 2026.7.22 | 全新升级版本

-

源码下载

-

如果您想从源码编译 Oraset:

+

Windows B-5

+

EXE 可执行文件

-

编译方法:

-
make

diff --git a/website/download/exe/Oraset-B-5.exe b/website/download/exe/Oraset-B-5.exe new file mode 100644 index 0000000000000000000000000000000000000000..8d8db0dbfbef352891e4e0a89985e4421ba0e6f2 GIT binary patch literal 110619 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 WX|Tfn_@kWC&kbXdQbpY~`@aB$OY8su literal 0 HcmV?d00001 diff --git a/website/download/source/Oraset-B-5-source/Makefile b/website/download/source/Oraset-B-5-source/Makefile new file mode 100644 index 0000000..8558a60 --- /dev/null +++ b/website/download/source/Oraset-B-5-source/Makefile @@ -0,0 +1,26 @@ +CC = gcc +CFLAGS = -Wall -Wextra -O2 -std=c11 +BINDIR = bin + +TARGET = $(BINDIR)/oraset + +SRCS = src/main.c + +all: $(TARGET) + +$(TARGET): $(SRCS) + @mkdir -p $(BINDIR) + $(CC) $(CFLAGS) -o $(TARGET) $(SRCS) + +clean: + rm -f $(TARGET) + rm -rf $(BINDIR) + +pkg: all + rm -rf pkg-root + mkdir -p pkg-root/usr/local/bin + cp bin/oraset pkg-root/usr/local/bin/oraset + chmod +x pkg-root/usr/local/bin/oraset + pkgbuild --root pkg-root --identifier com.oraset.lang --version B-5 --install-location / Oraset-B5.pkg + +.PHONY: all clean pkg \ No newline at end of file diff --git a/website/download/source/Oraset-B-5-source/src/main.c b/website/download/source/Oraset-B-5-source/src/main.c new file mode 100644 index 0000000..f58fd3f --- /dev/null +++ b/website/download/source/Oraset-B-5-source/src/main.c @@ -0,0 +1,2425 @@ +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + #include + #include + #define OS_WINDOWS 1 +#else + #include + #include + #include + #define OS_WINDOWS 0 +#endif + +#define VERSION "B-5" +#define MAX_TOKENS 8192 +#define MAX_VARS 512 +#define MAX_LINE 8192 +#define MAX_STRING 2048 +#define MAX_ARRAY_SIZE 1024 + +typedef enum { + TOKEN_EOF, + TOKEN_IDENTIFIER, + TOKEN_STRING, + TOKEN_NUMBER, + TOKEN_PRINT, + TOKEN_VAR, + TOKEN_IF, + TOKEN_WHILE, + TOKEN_FOR, + TOKEN_FUNCTION, + TOKEN_RETURN, + TOKEN_ELSE, + TOKEN_LPAREN, + TOKEN_RPAREN, + TOKEN_LBRACE, + TOKEN_RBRACE, + TOKEN_LBRACKET, + TOKEN_RBRACKET, + TOKEN_COMMA, + TOKEN_SEMICOLON, + TOKEN_ASSIGN, + TOKEN_PLUS, + TOKEN_MINUS, + TOKEN_MULTIPLY, + TOKEN_DIVIDE, + TOKEN_EQUAL, + TOKEN_NOT_EQUAL, + TOKEN_GREATER, + TOKEN_LESS, + TOKEN_AND, + TOKEN_OR, + TOKEN_NOT, + TOKEN_GREATER_EQUAL, + TOKEN_LESS_EQUAL, + TOKEN_MODULO, + TOKEN_PLUS_ASSIGN, + TOKEN_MINUS_ASSIGN, + TOKEN_MULTIPLY_ASSIGN, + TOKEN_DIVIDE_ASSIGN, + TOKEN_MODULO_ASSIGN, + TOKEN_INCREMENT, + TOKEN_DECREMENT, + TOKEN_COLON, + TOKEN_DOT, + TOKEN_ARROW, + TOKEN_SWITCH, + TOKEN_CASE, + TOKEN_DEFAULT, + TOKEN_BREAK, + TOKEN_CONTINUE, + TOKEN_DO, + TOKEN_STRUCT, + TOKEN_TYPEDEF, + TOKEN_ENUM, + TOKEN_GOTO, + TOKEN_BIT_AND, + TOKEN_BIT_OR, + TOKEN_BIT_XOR, + TOKEN_BIT_NOT, + TOKEN_SHIFT_LEFT, + TOKEN_SHIFT_RIGHT, + TOKEN_NEW, + TOKEN_DELETE, + TOKEN_TRY, + TOKEN_CATCH, + TOKEN_THROW, + TOKEN_ASTERISK, + TOKEN_LABEL +} OraTokenType; + +typedef struct { + OraTokenType type; + char value[MAX_STRING]; + int line; +} Token; + +typedef enum { + VAL_NUMBER, + VAL_STRING, + VAL_ARRAY, + VAL_STRUCT, + VAL_ENUM, + VAL_POINTER +} ValueType; + +typedef struct { + ValueType type; + double num_value; + char str_value[MAX_STRING]; + double arr_value[MAX_ARRAY_SIZE]; + int arr_size; + int struct_type; + int pointer_target; +} Value; + +typedef struct { + char name[64]; + Value value; +} Variable; + +typedef struct { + char name[64]; + int param_count; + char params[8][64]; + int body_start; + int body_end; +} Function; + +typedef struct { + char name[64]; + char fields[16][64]; + int field_count; +} StructType; + +typedef struct { + char name[64]; + char values[16][64]; + int value_count; +} EnumType; + +typedef struct { + char name[64]; + int token_index; +} Label; + +Token tokens[MAX_TOKENS]; +int token_count = 0; +int current_token = 0; +Variable vars[MAX_VARS]; +int var_count = 0; +Function funcs[MAX_VARS]; +int func_count = 0; +StructType structs[MAX_VARS]; +int struct_count = 0; +EnumType enums[MAX_VARS]; +int enum_count = 0; +Label labels[MAX_VARS]; +int label_count = 0; +int print_newline = 1; +int current_line = 1; +int in_for_loop_update = 0; +int in_repl = 0; +int loop_depth = 0; +int switch_active = 0; + +int match(OraTokenType type); +Value* find_variable(const char* name); + +static const struct { + const char* name; + OraTokenType type; +} keywords[] = { + {"echo", TOKEN_PRINT}, + {"let", TOKEN_VAR}, + {"if", TOKEN_IF}, + {"else", TOKEN_ELSE}, + {"while", TOKEN_WHILE}, + {"for", TOKEN_FOR}, + {"proc", TOKEN_FUNCTION}, + {"return", TOKEN_RETURN}, + {"switch", TOKEN_SWITCH}, + {"case", TOKEN_CASE}, + {"default", TOKEN_DEFAULT}, + {"break", TOKEN_BREAK}, + {"continue", TOKEN_CONTINUE}, + {"do", TOKEN_DO}, + {"struct", TOKEN_STRUCT}, + {"typedef", TOKEN_TYPEDEF}, + {"enum", TOKEN_ENUM}, + {"goto", TOKEN_GOTO}, + {"new", TOKEN_NEW}, + {"delete", TOKEN_DELETE}, + {"try", TOKEN_TRY}, + {"catch", TOKEN_CATCH}, + {"throw", TOKEN_THROW}, + {NULL, TOKEN_EOF} +}; + +void error(const char* msg, ...) { + va_list args; + va_start(args, msg); + fprintf(stderr, "[Error at line %d] ", current_line); + vfprintf(stderr, msg, args); + fprintf(stderr, "\n"); + va_end(args); + if (in_repl) return; + exit(1); +} + +static const char* get_string_value() { + if (match(TOKEN_STRING)) { + return tokens[current_token - 1].value; + } else if (match(TOKEN_IDENTIFIER)) { + const char* name = tokens[current_token - 1].value; + Value* v = find_variable(name); + if (!v || v->type != VAL_STRING) { + error("Expected string variable: %s", name); + } + return v->str_value; + } + error("Expected string"); + return ""; +} + +static void skip_whitespace_and_comments(const char** p) { + while (**p) { + if (**p == ' ' || **p == '\t' || **p == '\r') { + (*p)++; + } else if (**p == '\n') { + (*p)++; + current_line++; + } else if (**p == '#' || (**p == '/' && *(*p+1) == '/')) { + while (**p && **p != '\n') (*p)++; + } else if (**p == '/' && *(*p+1) == '*') { + (*p) += 2; + while (**p && !(*(*p) == '*' && *(*p+1) == '/')) { + if (**p == '\n') current_line++; + (*p)++; + } + if (**p) (*p) += 2; + } else { + break; + } + } +} + +static void add_token(OraTokenType type, const char* value) { + if (token_count >= MAX_TOKENS) { + error("Too many tokens (max %d)", MAX_TOKENS); + } + tokens[token_count].type = type; + strncpy(tokens[token_count].value, value, MAX_STRING - 1); + tokens[token_count].value[MAX_STRING - 1] = '\0'; + tokens[token_count].line = current_line; + token_count++; +} + +void tokenize(const char* source) { + token_count = 0; + current_line = 1; + const char* p = source; + + while (1) { + skip_whitespace_and_comments(&p); + if (!*p) break; + + if (*p == '"') { + p++; + char buf[MAX_STRING]; + int i = 0; + while (*p && *p != '"' && i < MAX_STRING - 1) { + if (*p == '\\' && *(p+1)) { + p++; + switch (*p) { + case 'n': buf[i++] = '\n'; break; + case 't': buf[i++] = '\t'; break; + case 'r': buf[i++] = '\r'; break; + case '\\': buf[i++] = '\\'; break; + case '"': buf[i++] = '"'; break; + case '0': buf[i++] = '\0'; break; + default: buf[i++] = *p; break; + } + } else { + buf[i++] = *p; + } + p++; + } + buf[i] = '\0'; + if (*p != '"') error("Unterminated string literal"); + p++; + add_token(TOKEN_STRING, buf); + continue; + } + + if (*p == '\'') { + p++; + char buf[MAX_STRING]; + int i = 0; + while (*p && *p != '\'' && i < MAX_STRING - 1) { + if (*p == '\\' && *(p+1)) { + p++; + switch (*p) { + case 'n': buf[i++] = '\n'; break; + case 't': buf[i++] = '\t'; break; + case 'r': buf[i++] = '\r'; break; + case '\\': buf[i++] = '\\'; break; + case '\'': buf[i++] = '\''; break; + default: buf[i++] = *p; break; + } + } else { + buf[i++] = *p; + } + p++; + } + buf[i] = '\0'; + if (*p != '\'') error("Unterminated string literal"); + p++; + add_token(TOKEN_STRING, buf); + continue; + } + + if (isdigit(*p) || (*p == '.' && isdigit(*(p+1)))) { + char buf[64]; + int i = 0; + int dot_count = 0; + while ((isdigit(*p) || (*p == '.' && dot_count < 1)) && i < 63) { + if (*p == '.') dot_count++; + buf[i++] = *p++; + } + buf[i] = '\0'; + add_token(TOKEN_NUMBER, buf); + continue; + } + + if (isalpha(*p) || *p == '_') { + char buf[64]; + int i = 0; + while ((isalnum(*p) || *p == '_') && i < 63) { + buf[i++] = *p++; + } + buf[i] = '\0'; + + int j; + for (j = 0; keywords[j].name; j++) { + if (strcmp(buf, keywords[j].name) == 0) { + add_token(keywords[j].type, buf); + break; + } + } + if (!keywords[j].name) { + if (*p == ':') { + strncpy(labels[label_count].name, buf, 63); + labels[label_count].token_index = token_count + 1; + label_count++; + add_token(TOKEN_LABEL, buf); + p++; + } else { + add_token(TOKEN_IDENTIFIER, buf); + } + } + continue; + } + + if (*p == '=' && *(p+1) == '=') { add_token(TOKEN_EQUAL, "=="); p += 2; continue; } + if (*p == '!' && *(p+1) == '=') { add_token(TOKEN_NOT_EQUAL, "!="); p += 2; continue; } + if (*p == '&' && *(p+1) == '&') { add_token(TOKEN_AND, "&&"); p += 2; continue; } + if (*p == '|' && *(p+1) == '|') { add_token(TOKEN_OR, "||"); p += 2; continue; } + if (*p == '>' && *(p+1) == '=') { add_token(TOKEN_GREATER_EQUAL, ">="); p += 2; continue; } + if (*p == '<' && *(p+1) == '=') { add_token(TOKEN_LESS_EQUAL, "<="); p += 2; continue; } + if (*p == '+' && *(p+1) == '=') { add_token(TOKEN_PLUS_ASSIGN, "+="); p += 2; continue; } + if (*p == '-' && *(p+1) == '=') { add_token(TOKEN_MINUS_ASSIGN, "-="); p += 2; continue; } + if (*p == '*' && *(p+1) == '=') { add_token(TOKEN_MULTIPLY_ASSIGN, "*="); p += 2; continue; } + if (*p == '/' && *(p+1) == '=') { add_token(TOKEN_DIVIDE_ASSIGN, "/="); p += 2; continue; } + if (*p == '%' && *(p+1) == '=') { add_token(TOKEN_MODULO_ASSIGN, "%="); p += 2; continue; } + if (*p == '+' && *(p+1) == '+') { add_token(TOKEN_INCREMENT, "++"); p += 2; continue; } + if (*p == '-' && *(p+1) == '-') { add_token(TOKEN_DECREMENT, "--"); p += 2; continue; } + if (*p == '-' && *(p+1) == '>') { add_token(TOKEN_ARROW, "->"); p += 2; continue; } + if (*p == '<' && *(p+1) == '<') { add_token(TOKEN_SHIFT_LEFT, "<<"); p += 2; continue; } + if (*p == '>' && *(p+1) == '>') { add_token(TOKEN_SHIFT_RIGHT, ">>"); p += 2; continue; } + + switch (*p) { + case '&': add_token(TOKEN_BIT_AND, "&"); break; + case '|': add_token(TOKEN_BIT_OR, "|"); break; + case '^': add_token(TOKEN_BIT_XOR, "^"); break; + case '~': add_token(TOKEN_BIT_NOT, "~"); break; + case '(': add_token(TOKEN_LPAREN, "("); break; + case ')': add_token(TOKEN_RPAREN, ")"); break; + case '{': add_token(TOKEN_LBRACE, "{"); break; + case '}': add_token(TOKEN_RBRACE, "}"); break; + case '[': add_token(TOKEN_LBRACKET, "["); break; + case ']': add_token(TOKEN_RBRACKET, "]"); break; + case ',': add_token(TOKEN_COMMA, ","); break; + case ';': add_token(TOKEN_SEMICOLON, ";"); break; + case '=': add_token(TOKEN_ASSIGN, "="); break; + case '>': add_token(TOKEN_GREATER, ">"); break; + case '<': add_token(TOKEN_LESS, "<"); break; + case '+': add_token(TOKEN_PLUS, "+"); break; + case '-': add_token(TOKEN_MINUS, "-"); break; + case '*': add_token(TOKEN_MULTIPLY, "*"); break; + case '/': add_token(TOKEN_DIVIDE, "/"); break; + case '%': add_token(TOKEN_MODULO, "%"); break; + case '!': add_token(TOKEN_NOT, "!"); break; + case ':': add_token(TOKEN_COLON, ":"); break; + case '.': add_token(TOKEN_DOT, "."); break; + default: error("Unknown character: '%c'", *p); + } + p++; + } + + add_token(TOKEN_EOF, ""); +} + +Token peek() { return tokens[current_token]; } +Token advance() { return tokens[current_token++]; } + +int match(OraTokenType type) { + if (peek().type == type) { + if (tokens[current_token].line > 0) { + current_line = tokens[current_token].line; + } + advance(); + return 1; + } + return 0; +} + +void consume(OraTokenType type, const char* msg) { + if (!match(type)) { + error("%s (got '%s')", msg, peek().value); + } +} + +double evaluate(); +int execute_statement(); +int update_oraset(const char* target_version); + +Value* find_variable(const char* name) { + for (int i = var_count - 1; i >= 0; i--) { + if (strcmp(vars[i].name, name) == 0) { + return &vars[i].value; + } + } + return NULL; +} + +int find_function(const char* name) { + for (int i = func_count - 1; i >= 0; i--) { + if (strcmp(funcs[i].name, name) == 0) { + return i; + } + } + return -1; +} + +int find_struct(const char* name) { + for (int i = struct_count - 1; i >= 0; i--) { + if (strcmp(structs[i].name, name) == 0) { + return i; + } + } + return -1; +} + +int find_enum(const char* name) { + for (int i = enum_count - 1; i >= 0; i--) { + if (strcmp(enums[i].name, name) == 0) { + return i; + } + } + return -1; +} + +int find_label(const char* name) { + for (int i = label_count - 1; i >= 0; i--) { + if (strcmp(labels[i].name, name) == 0) { + return i; + } + } + return -1; +} + +double parse_array_access(Value* arr, int index) { + if (arr->type != VAL_ARRAY) { + error("Cannot index non-array value"); + } + if (index < 0 || index >= arr->arr_size) { + error("Array index out of bounds: %d", index); + } + return arr->arr_value[index]; +} + +double parse_primary(); + +double parse_call(const char* func_name) { + consume(TOKEN_LPAREN, "Expected '(' after function name"); + + if (strcmp(func_name, "abs") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return fabs(val); + } else if (strcmp(func_name, "sqrt") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return sqrt(val); + } else if (strcmp(func_name, "sin") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return sin(val); + } else if (strcmp(func_name, "cos") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return cos(val); + } else if (strcmp(func_name, "tan") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return tan(val); + } else if (strcmp(func_name, "random") == 0) { + if (match(TOKEN_RPAREN)) { + return (double)rand() / RAND_MAX; + } + double max = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return fmod((double)rand(), max); + } else if (strcmp(func_name, "size") == 0) { + if (match(TOKEN_STRING)) { + const char* str = tokens[current_token - 1].value; + consume(TOKEN_RPAREN, "Expected ')'"); + return strlen(str); + } + error("Expected string argument for size()"); + } else if (strcmp(func_name, "to_num") == 0) { + if (match(TOKEN_STRING)) { + const char* str = tokens[current_token - 1].value; + consume(TOKEN_RPAREN, "Expected ')'"); + return atof(str); + } + error("Expected string argument for to_num()"); + } else if (strcmp(func_name, "to_str") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + char buf[MAX_STRING]; + sprintf(buf, "%g", val); + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_str_result") == 0) { + strncpy(vars[i].value.str_value, buf, MAX_STRING - 1); + vars[i].value.str_value[MAX_STRING - 1] = '\0'; + vars[i].value.type = VAL_STRING; + return 0; + } + } + strncpy(vars[var_count].name, "__tmp_str_result", 63); + strncpy(vars[var_count].value.str_value, buf, MAX_STRING - 1); + vars[var_count].value.str_value[MAX_STRING - 1] = '\0'; + vars[var_count].value.type = VAL_STRING; + var_count++; + return 0; + } else if (strcmp(func_name, "input") == 0) { + const char* prompt = ""; + if (match(TOKEN_STRING)) { + prompt = tokens[current_token - 1].value; + } + consume(TOKEN_RPAREN, "Expected ')'"); + + printf("%s", prompt); + fflush(stdout); + + char input[MAX_STRING]; + if (fgets(input, MAX_STRING, stdin) == NULL) { + error("Failed to read input"); + } + + input[strcspn(input, "\n")] = '\0'; + + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__input_result") == 0) { + strncpy(vars[i].value.str_value, input, MAX_STRING - 1); + vars[i].value.str_value[MAX_STRING - 1] = '\0'; + vars[i].value.type = VAL_STRING; + return 0; + } + } + strncpy(vars[var_count].name, "__input_result", 63); + strncpy(vars[var_count].value.str_value, input, MAX_STRING - 1); + vars[var_count].value.str_value[MAX_STRING - 1] = '\0'; + vars[var_count].value.type = VAL_STRING; + var_count++; + return 0; + } else if (strcmp(func_name, "int") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return (int)val; + } else if (strcmp(func_name, "float") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return val; + } else if (strcmp(func_name, "floor") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return floor(val); + } else if (strcmp(func_name, "ceil") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return ceil(val); + } else if (strcmp(func_name, "round") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return round(val); + } else if (strcmp(func_name, "pow") == 0) { + double base = evaluate(); + consume(TOKEN_COMMA, "Expected ','"); + double exp = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return pow(base, exp); + } else if (strcmp(func_name, "log") == 0) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return log(val); + } else if (strcmp(func_name, "time") == 0) { + consume(TOKEN_RPAREN, "Expected ')'"); + return (double)time(NULL); + } else if (strcmp(func_name, "array") == 0) { + int size = (int)evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_arr_result") == 0) { + vars[i].value.type = VAL_ARRAY; + vars[i].value.arr_size = size; + for (int j = 0; j < size; j++) { + vars[i].value.arr_value[j] = 0; + } + return 0; + } + } + strncpy(vars[var_count].name, "__tmp_arr_result", 63); + vars[var_count].value.type = VAL_ARRAY; + vars[var_count].value.arr_size = size; + for (int j = 0; j < size; j++) { + vars[var_count].value.arr_value[j] = 0; + } + var_count++; + return 0; + } else if (strcmp(func_name, "arrlen") == 0) { + consume(TOKEN_IDENTIFIER, "Expected array variable"); + const char* name = tokens[current_token - 1].value; + Value* v = find_variable(name); + if (!v || v->type != VAL_ARRAY) { + error("'%s' is not an array", name); + } + consume(TOKEN_RPAREN, "Expected ')'"); + return v->arr_size; + } else if (strcmp(func_name, "exit") == 0) { + int code = (int)evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + exit(code); + } else if (strcmp(func_name, "assert") == 0) { + double cond = evaluate(); + consume(TOKEN_COMMA, "Expected ','"); + if (match(TOKEN_STRING)) { + const char* msg = tokens[current_token - 1].value; + consume(TOKEN_RPAREN, "Expected ')'"); + if (cond == 0) { + error("Assertion failed: %s", msg); + } + } else { + consume(TOKEN_RPAREN, "Expected ')'"); + if (cond == 0) { + error("Assertion failed"); + } + } + return 1; + } else if (strcmp(func_name, "strcmp") == 0) { + const char* str1 = get_string_value(); + consume(TOKEN_COMMA, "Expected ','"); + const char* str2 = get_string_value(); + consume(TOKEN_RPAREN, "Expected ')'"); + return strcmp(str1, str2); + } else if (strcmp(func_name, "strcpy") == 0) { + const char* src = get_string_value(); + consume(TOKEN_RPAREN, "Expected ')'"); + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_str_result") == 0) { + strncpy(vars[i].value.str_value, src, MAX_STRING - 1); + vars[i].value.str_value[MAX_STRING - 1] = '\0'; + vars[i].value.type = VAL_STRING; + return 0; + } + } + strncpy(vars[var_count].name, "__tmp_str_result", 63); + strncpy(vars[var_count].value.str_value, src, MAX_STRING - 1); + vars[var_count].value.str_value[MAX_STRING - 1] = '\0'; + vars[var_count].value.type = VAL_STRING; + var_count++; + return 0; + } else if (strcmp(func_name, "strcat") == 0) { + const char* str1 = get_string_value(); + consume(TOKEN_COMMA, "Expected ','"); + const char* str2 = get_string_value(); + consume(TOKEN_RPAREN, "Expected ')'"); + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_str_result") == 0) { + strncpy(vars[i].value.str_value, str1, MAX_STRING - 1); + strncat(vars[i].value.str_value, str2, MAX_STRING - strlen(vars[i].value.str_value) - 1); + vars[i].value.type = VAL_STRING; + return 0; + } + } + strncpy(vars[var_count].name, "__tmp_str_result", 63); + strncpy(vars[var_count].value.str_value, str1, MAX_STRING - 1); + strncat(vars[var_count].value.str_value, str2, MAX_STRING - strlen(vars[var_count].value.str_value) - 1); + vars[var_count].value.type = VAL_STRING; + var_count++; + return 0; + } else if (strcmp(func_name, "sizeof") == 0) { + consume(TOKEN_IDENTIFIER, "Expected variable name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_RPAREN, "Expected ')'"); + Value* v = find_variable(name); + if (!v) error("Undefined variable: %s", name); + if (v->type == VAL_STRING) { + return strlen(v->str_value); + } else if (v->type == VAL_ARRAY) { + return v->arr_size; + } + return sizeof(double); + } else if (strcmp(func_name, "malloc") == 0) { + int size = (int)evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_arr_result") == 0) { + vars[i].value.type = VAL_ARRAY; + vars[i].value.arr_size = size; + for (int j = 0; j < size; j++) { + vars[i].value.arr_value[j] = 0; + } + return 0; + } + } + strncpy(vars[var_count].name, "__tmp_arr_result", 63); + vars[var_count].value.type = VAL_ARRAY; + vars[var_count].value.arr_size = size; + for (int j = 0; j < size; j++) { + vars[var_count].value.arr_value[j] = 0; + } + var_count++; + return 0; + } else if (strcmp(func_name, "memcpy") == 0) { + consume(TOKEN_IDENTIFIER, "Expected destination array"); + const char* dest_name = tokens[current_token - 1].value; + consume(TOKEN_COMMA, "Expected ','"); + consume(TOKEN_IDENTIFIER, "Expected source array"); + const char* src_name = tokens[current_token - 1].value; + consume(TOKEN_COMMA, "Expected ','"); + int count = (int)evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + Value* dest = find_variable(dest_name); + Value* src = find_variable(src_name); + if (!dest || dest->type != VAL_ARRAY) error("Invalid destination array"); + if (!src || src->type != VAL_ARRAY) error("Invalid source array"); + for (int i = 0; i < count && i < dest->arr_size && i < src->arr_size; i++) { + dest->arr_value[i] = src->arr_value[i]; + } + return 0; + } else if (strcmp(func_name, "memcmp") == 0) { + consume(TOKEN_IDENTIFIER, "Expected first array"); + const char* name1 = tokens[current_token - 1].value; + consume(TOKEN_COMMA, "Expected ','"); + consume(TOKEN_IDENTIFIER, "Expected second array"); + const char* name2 = tokens[current_token - 1].value; + consume(TOKEN_COMMA, "Expected ','"); + int count = (int)evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + Value* arr1 = find_variable(name1); + Value* arr2 = find_variable(name2); + if (!arr1 || arr1->type != VAL_ARRAY) error("Invalid first array"); + if (!arr2 || arr2->type != VAL_ARRAY) error("Invalid second array"); + for (int i = 0; i < count && i < arr1->arr_size && i < arr2->arr_size; i++) { + if (arr1->arr_value[i] != arr2->arr_value[i]) { + return arr1->arr_value[i] - arr2->arr_value[i]; + } + } + return 0; + } else { + int func_idx = find_function(func_name); + if (func_idx >= 0) { + int saved_var_count = var_count; + for (int i = 0; i < funcs[func_idx].param_count; i++) { + if (i > 0) consume(TOKEN_COMMA, "Expected ','"); + strncpy(vars[var_count].name, funcs[func_idx].params[i], 63); + vars[var_count].value.num_value = evaluate(); + vars[var_count].value.type = VAL_NUMBER; + var_count++; + } + consume(TOKEN_RPAREN, "Expected ')'"); + + int saved_token = current_token; + current_token = funcs[func_idx].body_start; + while (current_token < funcs[func_idx].body_end && peek().type != TOKEN_EOF) { + if (execute_statement() == 1) break; + } + current_token = saved_token; + + double result = 0; + for (int i = var_count - 1; i >= 0; i--) { + if (strcmp(vars[i].name, "__return_value") == 0) { + result = vars[i].value.num_value; + break; + } + } + var_count = saved_var_count; + return result; + } + error("Undefined function: %s", func_name); + } + return 0; +} + +double parse_primary() { + if (match(TOKEN_NUMBER)) { + return atof(tokens[current_token - 1].value); + } + if (match(TOKEN_STRING)) { + error("Cannot use string directly in expression"); + } + if (match(TOKEN_IDENTIFIER)) { + const char* name = tokens[current_token - 1].value; + if (peek().type == TOKEN_LPAREN) { + return parse_call(name); + } + if (peek().type == TOKEN_LBRACKET) { + Value* v = find_variable(name); + if (!v) error("Undefined variable: %s", name); + advance(); + int index = (int)evaluate(); + consume(TOKEN_RBRACKET, "Expected ']'"); + return parse_array_access(v, index); + } + if (peek().type == TOKEN_DOT) { + Value* v = find_variable(name); + if (!v) error("Undefined variable: %s", name); + if (v->type != VAL_STRUCT) { + error("Cannot access field of non-struct variable"); + } + advance(); + consume(TOKEN_IDENTIFIER, "Expected field name"); + const char* field_name = tokens[current_token - 1].value; + int struct_idx = v->struct_type; + for (int i = 0; i < structs[struct_idx].field_count; i++) { + if (strcmp(structs[struct_idx].fields[i], field_name) == 0) { + return (double)i; + } + } + error("Undefined field: %s", field_name); + } + Value* v = find_variable(name); + if (!v) error("Undefined variable: %s", name); + if (v->type == VAL_STRING) { + error("Cannot use string variable in numeric expression"); + } + return v->num_value; + } + if (match(TOKEN_LPAREN)) { + double val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + return val; + } + error("Expected expression (got '%s')", peek().value); + return 0; +} + +double parse_unary() { + if (match(TOKEN_NOT)) { + return parse_unary() == 0 ? 1 : 0; + } + if (match(TOKEN_MINUS)) { + return -parse_unary(); + } + if (match(TOKEN_PLUS)) { + return parse_unary(); + } + if (match(TOKEN_BIT_NOT)) { + return ~(int)parse_unary(); + } + return parse_primary(); +} + +double parse_factor() { + double left = parse_unary(); + while (match(TOKEN_MULTIPLY) || match(TOKEN_DIVIDE) || match(TOKEN_MODULO)) { + OraTokenType op = tokens[current_token - 1].type; + double right = parse_unary(); + if (op == TOKEN_MULTIPLY) left *= right; + else if (op == TOKEN_DIVIDE) { + if (right == 0) error("Division by zero"); + left /= right; + } else { + if (right == 0) error("Modulo by zero"); + left = fmod(left, right); + } + } + return left; +} + +double parse_term() { + double left = parse_factor(); + while (match(TOKEN_PLUS) || match(TOKEN_MINUS)) { + OraTokenType op = tokens[current_token - 1].type; + double right = parse_factor(); + if (op == TOKEN_PLUS) left += right; + else left -= right; + } + return left; +} + +double parse_shift() { + double left = parse_term(); + while (match(TOKEN_SHIFT_LEFT) || match(TOKEN_SHIFT_RIGHT)) { + OraTokenType op = tokens[current_token - 1].type; + double right = parse_term(); + if (op == TOKEN_SHIFT_LEFT) left = (int)left << (int)right; + else left = (int)left >> (int)right; + } + return left; +} + +double parse_bit_and() { + double left = parse_shift(); + while (match(TOKEN_BIT_AND)) { + double right = parse_shift(); + left = (int)left & (int)right; + } + return left; +} + +double parse_bit_xor() { + double left = parse_bit_and(); + while (match(TOKEN_BIT_XOR)) { + double right = parse_bit_and(); + left = (int)left ^ (int)right; + } + return left; +} + +double parse_bit_or() { + double left = parse_bit_xor(); + while (match(TOKEN_BIT_OR)) { + double right = parse_bit_xor(); + left = (int)left | (int)right; + } + return left; +} + +double parse_comparison() { + double left = parse_bit_or(); + while (1) { + if (match(TOKEN_EQUAL)) { + double right = parse_bit_or(); + left = (left == right) ? 1 : 0; + } else if (match(TOKEN_NOT_EQUAL)) { + double right = parse_bit_or(); + left = (left != right) ? 1 : 0; + } else if (match(TOKEN_GREATER)) { + double right = parse_bit_or(); + left = (left > right) ? 1 : 0; + } else if (match(TOKEN_LESS)) { + double right = parse_bit_or(); + left = (left < right) ? 1 : 0; + } else if (match(TOKEN_GREATER_EQUAL)) { + double right = parse_bit_or(); + left = (left >= right) ? 1 : 0; + } else if (match(TOKEN_LESS_EQUAL)) { + double right = parse_bit_or(); + left = (left <= right) ? 1 : 0; + } else { + break; + } + } + return left; +} + +double parse_logic_and() { + double left = parse_comparison(); + while (match(TOKEN_AND)) { + double right = parse_comparison(); + left = (left != 0 && right != 0) ? 1 : 0; + } + return left; +} + +double parse_logic_or() { + double left = parse_logic_and(); + while (match(TOKEN_OR)) { + double right = parse_logic_and(); + left = (left != 0 || right != 0) ? 1 : 0; + } + return left; +} + +double evaluate() { + return parse_logic_or(); +} + +void execute_print() { + consume(TOKEN_LPAREN, "Expected '(' after print"); + int first = 1; + int newline = print_newline; + + while (!match(TOKEN_RPAREN)) { + if (!first) consume(TOKEN_COMMA, "Expected ',' between arguments"); + + if (match(TOKEN_STRING)) { + const char* str = tokens[current_token - 1].value; + if (strcmp(str, "nel") == 0) { + newline = 0; + first = 0; + continue; + } + if (!first) printf(" "); + printf("%s", str); + } else if (match(TOKEN_NUMBER)) { + if (!first) printf(" "); + printf("%s", tokens[current_token - 1].value); + } else if (match(TOKEN_BIT_NOT) || match(TOKEN_MINUS) || match(TOKEN_PLUS) || match(TOKEN_NOT)) { + current_token--; + double val = evaluate(); + if (!first) printf(" "); + printf("%g", val); + } else if (match(TOKEN_IDENTIFIER)) { + const char* name = tokens[current_token - 1].value; + if (peek().type == TOKEN_PLUS || peek().type == TOKEN_MINUS || + peek().type == TOKEN_MULTIPLY || peek().type == TOKEN_DIVIDE || + peek().type == TOKEN_MODULO || peek().type == TOKEN_BIT_AND || + peek().type == TOKEN_BIT_OR || peek().type == TOKEN_BIT_XOR || + peek().type == TOKEN_SHIFT_LEFT || peek().type == TOKEN_SHIFT_RIGHT) { + current_token--; + double val = evaluate(); + if (!first) printf(" "); + printf("%g", val); + } else if (peek().type == TOKEN_BIT_NOT) { + current_token--; + double val = evaluate(); + if (!first) printf(" "); + printf("%g", val); + } else if (peek().type == TOKEN_LBRACKET) { + Value* v = find_variable(name); + if (!v) error("Undefined variable: %s", name); + advance(); + int index = (int)evaluate(); + consume(TOKEN_RBRACKET, "Expected ']'"); + if (!first) printf(" "); + printf("%g", parse_array_access(v, index)); + } else if (peek().type == TOKEN_LPAREN) { + int func_idx = find_function(name); + if (func_idx >= 0) { + consume(TOKEN_LPAREN, "Expected '('"); + int saved_var_count = var_count; + for (int i = 0; i < funcs[func_idx].param_count; i++) { + if (i > 0) consume(TOKEN_COMMA, "Expected ','"); + strncpy(vars[var_count].name, funcs[func_idx].params[i], 63); + vars[var_count].value.num_value = evaluate(); + vars[var_count].value.type = VAL_NUMBER; + var_count++; + } + consume(TOKEN_RPAREN, "Expected ')'"); + + int saved_token = current_token; + current_token = funcs[func_idx].body_start; + while (current_token < funcs[func_idx].body_end && peek().type != TOKEN_EOF) { + execute_statement(); + } + current_token = saved_token; + var_count = saved_var_count; + + for (int i = var_count - 1; i >= 0; i--) { + if (strcmp(vars[i].name, "__return_value") == 0) { + if (!first) printf(" "); + printf("%g", vars[i].value.num_value); + break; + } + } + } else { + if (!first) printf(" "); + printf("%g", parse_call(name)); + } + } else { + int found = 0; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + if (!first) printf(" "); + if (vars[i].value.type == VAL_STRING) { + printf("%s", vars[i].value.str_value); + } else if (vars[i].value.type == VAL_ARRAY) { + printf("["); + for (int j = 0; j < vars[i].value.arr_size; j++) { + if (j > 0) printf(", "); + printf("%g", vars[i].value.arr_value[j]); + } + printf("]"); + } else { + printf("%g", vars[i].value.num_value); + } + found = 1; + break; + } + } + if (!found) error("Undefined variable: %s", name); + } + } else { + error("Unexpected token in print: '%s'", peek().value); + } + first = 0; + } + + if (newline) { + printf("\n"); + } + fflush(stdout); +} + +void execute_var() { + consume(TOKEN_IDENTIFIER, "Expected variable name"); + const char* name = tokens[current_token - 1].value; + + if (var_count >= MAX_VARS) { + error("Too many variables (max %d)", MAX_VARS); + } + + Variable* v = &vars[var_count]; + strncpy(v->name, name, 63); + v->name[63] = '\0'; + var_count++; + + if (match(TOKEN_ASSIGN)) { + if (match(TOKEN_STRING)) { + strncpy(v->value.str_value, tokens[current_token - 1].value, MAX_STRING - 1); + v->value.str_value[MAX_STRING - 1] = '\0'; + v->value.type = VAL_STRING; + v->value.num_value = 0; + } else if (match(TOKEN_LBRACKET)) { + v->value.type = VAL_ARRAY; + v->value.arr_size = 0; + while (!match(TOKEN_RBRACKET)) { + if (v->value.arr_size > 0) consume(TOKEN_COMMA, "Expected ',' between array elements"); + v->value.arr_value[v->value.arr_size++] = evaluate(); + if (v->value.arr_size >= MAX_ARRAY_SIZE) { + error("Array size exceeds maximum (%d)", MAX_ARRAY_SIZE); + } + } + } else { + v->value.num_value = evaluate(); + v->value.type = VAL_NUMBER; + v->value.str_value[0] = '\0'; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, "__tmp_arr_result") == 0) { + v->value.type = vars[i].value.type; + v->value.arr_size = vars[i].value.arr_size; + for (int j = 0; j < vars[i].value.arr_size; j++) { + v->value.arr_value[j] = vars[i].value.arr_value[j]; + } + break; + } + } + } + } else { + v->value.type = VAL_NUMBER; + v->value.num_value = 0; + v->value.str_value[0] = '\0'; + } + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after variable declaration"); + } +} + +static void skip_block() { + int depth = 1; + while (depth > 0 && peek().type != TOKEN_EOF) { + Token t = advance(); + if (t.type == TOKEN_LBRACE) depth++; + if (t.type == TOKEN_RBRACE) depth--; + } +} + +int execute_if() { + consume(TOKEN_LPAREN, "Expected '(' after 'if'"); + double cond = evaluate(); + consume(TOKEN_RPAREN, "Expected ')' after condition"); + + if (match(TOKEN_LBRACE)) { + if (cond != 0) { + while (!match(TOKEN_RBRACE) && peek().type != TOKEN_EOF) { + int result = execute_statement(); + if (result == 2 || result == 3) { + return result; + } + } + } else { + skip_block(); + } + } else { + if (cond != 0) { + int result = execute_statement(); + if (result == 2 || result == 3) { + return result; + } + } else { + while (peek().type != TOKEN_SEMICOLON && peek().type != TOKEN_EOF) { + advance(); + } + consume(TOKEN_SEMICOLON, "Expected ';'"); + } + } + + if (match(TOKEN_ELSE)) { + if (match(TOKEN_LBRACE)) { + if (cond == 0) { + while (!match(TOKEN_RBRACE) && peek().type != TOKEN_EOF) { + int result = execute_statement(); + if (result == 2 || result == 3) { + return result; + } + } + } else { + skip_block(); + } + } else { + if (cond == 0) { + int result = execute_statement(); + if (result == 2 || result == 3) { + return result; + } + } else { + while (peek().type != TOKEN_SEMICOLON && peek().type != TOKEN_EOF) { + advance(); + } + consume(TOKEN_SEMICOLON, "Expected ';'"); + } + } + } + return 0; +} + +void execute_while() { + consume(TOKEN_LPAREN, "Expected '(' after 'while'"); + + int cond_start = current_token; + evaluate(); + consume(TOKEN_RPAREN, "Expected ')' after condition"); + consume(TOKEN_LBRACE, "Expected '{' after while condition"); + + int body_start = current_token; + skip_block(); + int body_end = current_token; + + int saved_loop_depth = loop_depth; + loop_depth++; + + while (1) { + current_token = cond_start; + current_line = tokens[cond_start].line; + double cond = evaluate(); + + if (cond == 0) { + current_token = body_end; + break; + } + + current_token = body_start; + while (current_token < body_end && peek().type != TOKEN_EOF && peek().type != TOKEN_RBRACE) { + int result = execute_statement(); + if (result == 2) { + break; + } + if (result == 3) { + break; + } + if (result == 1) { + loop_depth = saved_loop_depth; + return; + } + } + } + + loop_depth = saved_loop_depth; +} + +void execute_for() { + consume(TOKEN_LPAREN, "Expected '(' after 'for'"); + + int init_start = current_token; + while (peek().type != TOKEN_SEMICOLON && peek().type != TOKEN_EOF) { + advance(); + } + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int cond_start = current_token; + while (peek().type != TOKEN_SEMICOLON && peek().type != TOKEN_EOF) { + advance(); + } + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int update_start = current_token; + while (peek().type != TOKEN_RPAREN && peek().type != TOKEN_EOF) { + advance(); + } + consume(TOKEN_RPAREN, "Expected ')'"); + consume(TOKEN_LBRACE, "Expected '{'"); + + int body_start = current_token; + skip_block(); + int body_end = current_token; + + int saved_token = current_token; + current_token = init_start; + in_for_loop_update = 1; + while (peek().type != TOKEN_SEMICOLON && peek().type != TOKEN_EOF) { + execute_statement(); + } + in_for_loop_update = 0; + current_token = saved_token; + + int saved_loop_depth = loop_depth; + loop_depth++; + + while (1) { + double cond = 0; + int temp_token = cond_start; + current_token = cond_start; + current_line = tokens[cond_start].line; + + int paren_count = 0; + while (temp_token < token_count) { + if (tokens[temp_token].type == TOKEN_LPAREN) paren_count++; + if (tokens[temp_token].type == TOKEN_RPAREN) paren_count--; + if (tokens[temp_token].type == TOKEN_SEMICOLON && paren_count == 0) break; + temp_token++; + } + + cond = evaluate(); + + if (cond == 0) { + break; + } + + current_token = body_start; + while (current_token < body_end && peek().type != TOKEN_EOF) { + int result = execute_statement(); + if (result == 2) { + loop_depth = saved_loop_depth; + return; + } + if (result == 1) { + loop_depth = saved_loop_depth; + return; + } + } + + current_token = update_start; + in_for_loop_update = 1; + while (peek().type != TOKEN_RPAREN && peek().type != TOKEN_EOF) { + execute_statement(); + } + in_for_loop_update = 0; + } + + loop_depth = saved_loop_depth; +} + +extern int in_for_loop_update; + +void execute_function() { + consume(TOKEN_IDENTIFIER, "Expected function name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_LPAREN, "Expected '(' after function name"); + + int func_idx = func_count; + strncpy(funcs[func_idx].name, name, 63); + funcs[func_idx].param_count = 0; + + while (!match(TOKEN_RPAREN)) { + if (funcs[func_idx].param_count > 0) consume(TOKEN_COMMA, "Expected ','"); + consume(TOKEN_IDENTIFIER, "Expected parameter name"); + strncpy(funcs[func_idx].params[funcs[func_idx].param_count], + tokens[current_token - 1].value, 63); + funcs[func_idx].param_count++; + if (funcs[func_idx].param_count >= 8) { + error("Too many parameters (max 8)"); + } + } + + consume(TOKEN_LBRACE, "Expected '{'"); + funcs[func_idx].body_start = current_token; + + skip_block(); + funcs[func_idx].body_end = current_token; + func_count++; +} + +void execute_switch() { + consume(TOKEN_LPAREN, "Expected '('"); + double switch_val = evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + consume(TOKEN_LBRACE, "Expected '{'"); + + int saved_switch_active = switch_active; + switch_active = 1; + + int body_start = current_token; + skip_block(); + int body_end = current_token; + + int saved_token = current_token; + current_token = body_start; + + int should_execute = 0; + while (current_token < body_end && peek().type != TOKEN_EOF) { + if (match(TOKEN_CASE)) { + double case_val = evaluate(); + consume(TOKEN_COLON, "Expected ':' after case"); + if (!should_execute && case_val == switch_val) { + should_execute = 1; + } + } else if (match(TOKEN_DEFAULT)) { + consume(TOKEN_COLON, "Expected ':' after default"); + if (!should_execute) { + should_execute = 1; + } + } else { + if (should_execute) { + int result = execute_statement(); + if (result == 2) { + break; + } + } else { + advance(); + } + } + } + + current_token = saved_token; + switch_active = saved_switch_active; +} + +void execute_do_while() { + consume(TOKEN_LBRACE, "Expected '{'"); + + int body_start = current_token; + skip_block(); + int body_end = current_token; + + consume(TOKEN_WHILE, "Expected 'while'"); + consume(TOKEN_LPAREN, "Expected '('"); + + int cond_start = current_token; + evaluate(); + consume(TOKEN_RPAREN, "Expected ')'"); + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int saved_loop_depth = loop_depth; + loop_depth++; + + current_token = body_start; + while (current_token < body_end && peek().type != TOKEN_EOF && peek().type != TOKEN_RBRACE) { + int result = execute_statement(); + if (result == 2) { + break; + } + if (result == 3) { + break; + } + if (result == 1) { + loop_depth = saved_loop_depth; + return; + } + } + + while (1) { + current_token = cond_start; + current_line = tokens[cond_start].line; + double cond = evaluate(); + + if (cond == 0) { + break; + } + + current_token = body_start; + while (current_token < body_end && peek().type != TOKEN_EOF && peek().type != TOKEN_RBRACE) { + int result = execute_statement(); + if (result == 2) { + break; + } + if (result == 3) { + break; + } + if (result == 1) { + loop_depth = saved_loop_depth; + return; + } + } + } + + loop_depth = saved_loop_depth; +} + +void execute_struct() { + consume(TOKEN_IDENTIFIER, "Expected struct name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_LBRACE, "Expected '{'"); + + int struct_idx = struct_count; + strncpy(structs[struct_idx].name, name, 63); + structs[struct_idx].field_count = 0; + + while (peek().type != TOKEN_RBRACE && peek().type != TOKEN_EOF) { + if (peek().type == TOKEN_SEMICOLON) { + advance(); + continue; + } + consume(TOKEN_IDENTIFIER, "Expected field name"); + strncpy(structs[struct_idx].fields[structs[struct_idx].field_count], + tokens[current_token - 1].value, 63); + structs[struct_idx].field_count++; + if (structs[struct_idx].field_count >= 16) { + error("Too many fields in struct (max 16)"); + } + if (peek().type == TOKEN_SEMICOLON) { + advance(); + } + } + + consume(TOKEN_RBRACE, "Expected '}'"); + struct_count++; + if (match(TOKEN_SEMICOLON)) { + } +} + +void execute_enum() { + consume(TOKEN_IDENTIFIER, "Expected enum name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_LBRACE, "Expected '{'"); + + int enum_idx = enum_count; + strncpy(enums[enum_idx].name, name, 63); + enums[enum_idx].value_count = 0; + + while (peek().type != TOKEN_RBRACE && peek().type != TOKEN_EOF) { + consume(TOKEN_IDENTIFIER, "Expected enum value"); + strncpy(enums[enum_idx].values[enums[enum_idx].value_count], + tokens[current_token - 1].value, 63); + enums[enum_idx].value_count++; + if (enums[enum_idx].value_count >= 16) { + error("Too many values in enum (max 16)"); + } + if (match(TOKEN_COMMA)) { + continue; + } + break; + } + + consume(TOKEN_RBRACE, "Expected '}'"); + enum_count++; + if (match(TOKEN_SEMICOLON)) { + } +} + +void execute_typedef() { + consume(TOKEN_IDENTIFIER, "Expected original type"); + const char* orig_type = tokens[current_token - 1].value; + consume(TOKEN_IDENTIFIER, "Expected new type name"); + const char* new_name = tokens[current_token - 1].value; + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int struct_idx = find_struct(orig_type); + if (struct_idx >= 0) { + strncpy(structs[struct_count].name, new_name, 63); + structs[struct_count].field_count = structs[struct_idx].field_count; + for (int i = 0; i < structs[struct_idx].field_count; i++) { + strncpy(structs[struct_count].fields[i], structs[struct_idx].fields[i], 63); + } + struct_count++; + } else { + int enum_idx = find_enum(orig_type); + if (enum_idx >= 0) { + strncpy(enums[enum_count].name, new_name, 63); + enums[enum_count].value_count = enums[enum_idx].value_count; + for (int i = 0; i < enums[enum_idx].value_count; i++) { + strncpy(enums[enum_count].values[i], enums[enum_idx].values[i], 63); + } + enum_count++; + } + } +} + +void execute_goto() { + consume(TOKEN_IDENTIFIER, "Expected label name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int label_idx = find_label(name); + if (label_idx < 0) { + error("Undefined label: %s", name); + } + current_token = labels[label_idx].token_index; +} + +void execute_new() { + consume(TOKEN_IDENTIFIER, "Expected type name"); + const char* type_name = tokens[current_token - 1].value; + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int struct_idx = find_struct(type_name); + if (struct_idx >= 0) { + strncpy(vars[var_count].name, "__tmp_struct_result", 63); + vars[var_count].value.type = VAL_STRUCT; + vars[var_count].value.struct_type = struct_idx; + var_count++; + } +} + +void execute_delete() { + consume(TOKEN_IDENTIFIER, "Expected variable name"); + const char* name = tokens[current_token - 1].value; + consume(TOKEN_SEMICOLON, "Expected ';'"); + + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + for (int j = i; j < var_count - 1; j++) { + vars[j] = vars[j + 1]; + } + var_count--; + return; + } + } + error("Undefined variable: %s", name); +} + +void execute_try_catch() { + consume(TOKEN_LBRACE, "Expected '{'"); + + int try_start = current_token; + skip_block(); + int try_end = current_token; + + consume(TOKEN_CATCH, "Expected 'catch'"); + consume(TOKEN_LPAREN, "Expected '('"); + consume(TOKEN_IDENTIFIER, "Expected exception variable name"); + const char* exc_name = tokens[current_token - 1].value; + consume(TOKEN_RPAREN, "Expected ')'"); + consume(TOKEN_LBRACE, "Expected '{'"); + + int catch_start = current_token; + skip_block(); + int catch_end = current_token; + + int saved_var_count = var_count; + + current_token = try_start; + while (current_token < try_end && peek().type != TOKEN_EOF && peek().type != TOKEN_RBRACE) { + int result = execute_statement(); + if (result == 1) { + var_count = saved_var_count; + return; + } + } + + var_count = saved_var_count; +} + +void execute_throw() { + evaluate(); + consume(TOKEN_SEMICOLON, "Expected ';'"); +} + +void execute_return() { + if (peek().type == TOKEN_SEMICOLON || peek().type == TOKEN_RBRACE) { + consume(TOKEN_SEMICOLON, "Expected ';' after return"); + return; + } + double val = evaluate(); + consume(TOKEN_SEMICOLON, "Expected ';' after return"); + for (int i = var_count - 1; i >= 0; i--) { + if (strcmp(vars[i].name, "__return_value") == 0) { + vars[i].value.num_value = val; + vars[i].value.type = VAL_NUMBER; + return; + } + } + strncpy(vars[var_count].name, "__return_value", 63); + vars[var_count].value.num_value = val; + vars[var_count].value.type = VAL_NUMBER; + var_count++; +} + +int execute_statement() { + Token t = peek(); + + switch (t.type) { + case TOKEN_PRINT: + advance(); + execute_print(); + consume(TOKEN_SEMICOLON, "Expected ';' after print"); + return 0; + + case TOKEN_VAR: + advance(); + execute_var(); + return 0; + + case TOKEN_IF: + advance(); + return execute_if(); + + case TOKEN_WHILE: + advance(); + execute_while(); + return 0; + + case TOKEN_FOR: + advance(); + execute_for(); + return 0; + + case TOKEN_FUNCTION: + advance(); + execute_function(); + return 0; + + case TOKEN_SWITCH: + advance(); + execute_switch(); + return 0; + + case TOKEN_DO: + advance(); + execute_do_while(); + return 0; + + case TOKEN_BREAK: + advance(); + consume(TOKEN_SEMICOLON, "Expected ';' after break"); + if (loop_depth == 0 && !switch_active) { + error("break outside loop or switch"); + } + return 2; + + case TOKEN_CONTINUE: + advance(); + consume(TOKEN_SEMICOLON, "Expected ';' after continue"); + if (loop_depth == 0) { + error("continue outside loop"); + } + return 3; + + case TOKEN_RETURN: + advance(); + execute_return(); + return 1; + + case TOKEN_STRUCT: + advance(); + execute_struct(); + return 0; + + case TOKEN_ENUM: + advance(); + execute_enum(); + return 0; + + case TOKEN_TYPEDEF: + advance(); + execute_typedef(); + return 0; + + case TOKEN_GOTO: + advance(); + execute_goto(); + return 0; + + case TOKEN_NEW: + advance(); + execute_new(); + return 0; + + case TOKEN_DELETE: + advance(); + execute_delete(); + return 0; + + case TOKEN_TRY: + advance(); + execute_try_catch(); + return 0; + + case TOKEN_THROW: + advance(); + execute_throw(); + return 0; + + case TOKEN_LABEL: + advance(); + return 0; + + case TOKEN_IDENTIFIER: { + advance(); + if (match(TOKEN_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + if (match(TOKEN_STRING)) { + strncpy(vars[i].value.str_value, tokens[current_token - 1].value, MAX_STRING - 1); + vars[i].value.str_value[MAX_STRING - 1] = '\0'; + vars[i].value.type = VAL_STRING; + } else if (match(TOKEN_LBRACKET)) { + vars[i].value.type = VAL_ARRAY; + vars[i].value.arr_size = 0; + while (!match(TOKEN_RBRACKET)) { + if (vars[i].value.arr_size > 0) consume(TOKEN_COMMA, "Expected ','"); + vars[i].value.arr_value[vars[i].value.arr_size++] = evaluate(); + } + } else { + vars[i].value.num_value = evaluate(); + vars[i].value.type = VAL_NUMBER; + } + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_PLUS_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + if (vars[i].value.type == VAL_STRING) { + const char* str = tokens[current_token].value; + strncat(vars[i].value.str_value, str, MAX_STRING - strlen(vars[i].value.str_value) - 1); + } else { + vars[i].value.num_value += evaluate(); + } + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_MINUS_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + vars[i].value.num_value -= evaluate(); + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_MULTIPLY_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + vars[i].value.num_value *= evaluate(); + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_DIVIDE_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + double right = evaluate(); + if (right == 0) error("Division by zero"); + vars[i].value.num_value /= right; + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_MODULO_ASSIGN)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + double right = evaluate(); + if (right == 0) error("Modulo by zero"); + vars[i].value.num_value = fmod(vars[i].value.num_value, right); + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after assignment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_INCREMENT)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + vars[i].value.num_value++; + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after increment"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (match(TOKEN_DECREMENT)) { + const char* name = tokens[current_token - 2].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + vars[i].value.num_value--; + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';' after decrement"); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (peek().type == TOKEN_LBRACKET) { + const char* name = tokens[current_token - 1].value; + for (int i = 0; i < var_count; i++) { + if (strcmp(vars[i].name, name) == 0) { + advance(); + int index = (int)evaluate(); + consume(TOKEN_RBRACKET, "Expected ']'"); + if (match(TOKEN_ASSIGN)) { + vars[i].value.arr_value[index] = evaluate(); + if (!in_for_loop_update) { + consume(TOKEN_SEMICOLON, "Expected ';'"); + } + } else { + printf("%g\n", vars[i].value.arr_value[index]); + } + return 0; + } + } + error("Undefined variable: %s", name); + } else if (peek().type == TOKEN_LPAREN) { + const char* name = tokens[current_token - 1].value; + int func_idx = find_function(name); + if (func_idx >= 0) { + consume(TOKEN_LPAREN, "Expected '('"); + int saved_var_count = var_count; + for (int i = 0; i < funcs[func_idx].param_count; i++) { + if (i > 0) consume(TOKEN_COMMA, "Expected ','"); + strncpy(vars[var_count].name, funcs[func_idx].params[i], 63); + vars[var_count].value.num_value = evaluate(); + vars[var_count].value.type = VAL_NUMBER; + var_count++; + } + consume(TOKEN_RPAREN, "Expected ')'"); + consume(TOKEN_SEMICOLON, "Expected ';'"); + + int saved_token = current_token; + current_token = funcs[func_idx].body_start; + while (current_token < funcs[func_idx].body_end && peek().type != TOKEN_EOF) { + if (execute_statement() == 1) break; + } + current_token = saved_token; + var_count = saved_var_count; + return 0; + } + + parse_call(name); + consume(TOKEN_SEMICOLON, "Expected ';'"); + return 0; + } + error("Unexpected identifier: %s", tokens[current_token - 1].value); + return 0; + } + + case TOKEN_EOF: + break; + + default: + error("Unexpected token: %s", t.value); + } + return 0; +} + +void parse_config(const char* source) { + print_newline = 1; + const char* p = source; + + while (*p) { + if (*p == ' ' || *p == '\t' || *p == '\r') { + p++; + continue; + } + if (*p == '\n') break; + if (*p == '#') { + while (*p && *p != '\n') p++; + continue; + } + if (*p == 's' && *(p+1) == 'g' && *(p+2) == '<') { + p += 3; + while (*p && *p != '>') { + if (strncmp(p, "nel", 3) == 0) { + print_newline = 0; + break; + } + p++; + } + break; + } + break; + } +} + +char* strip_config(const char* source) { + const char* p = source; + + while (*p) { + if (*p == ' ' || *p == '\t' || *p == '\r') { + p++; + continue; + } + if (*p == '\n') { + return strdup(source); + } + if (*p == '#') { + while (*p && *p != '\n') p++; + if (*p == '\n') p++; + continue; + } + if (*p == 's' && *(p+1) == 'g' && *(p+2) == '<') { + const char* start = p; + while (*p && *p != '\n') p++; + if (*p == '\n') p++; + + size_t prefix_len = start - source; + size_t suffix_len = strlen(p); + char* result = malloc(prefix_len + suffix_len + 1); + if (!result) error("Out of memory"); + + memcpy(result, source, prefix_len); + memcpy(result + prefix_len, p, suffix_len + 1); + return result; + } + return strdup(source); + } + return strdup(source); +} + +void run(const char* source) { + static int rand_seeded = 0; + if (!rand_seeded) { + srand(time(NULL)); + rand_seeded = 1; + } + + parse_config(source); + char* clean_source = strip_config(source); + tokenize(clean_source); + current_token = 0; + + while (peek().type != TOKEN_EOF) { + execute_statement(); + } + + free(clean_source); +} + +void run_file(const char* path) { + FILE* f = fopen(path, "r"); + if (!f) { + error("Cannot open file: %s", path); + } + + fseek(f, 0, SEEK_END); + long size = ftell(f); + if (size < 0) { + fclose(f); + error("Cannot read file: %s", path); + } + fseek(f, 0, SEEK_SET); + + char* source = malloc(size + 1); + if (!source) { + fclose(f); + error("Out of memory"); + } + + size_t read = fread(source, 1, size, f); + fclose(f); + source[read] = '\0'; + + run(source); + free(source); +} + +void run_repl() { + in_repl = 1; + printf("Oraset B-5 REPL\n"); + printf("Type 'exit' or 'quit' to exit.\n"); + printf("> "); + + char line[MAX_LINE]; + while (fgets(line, MAX_LINE, stdin)) { + line[strcspn(line, "\n")] = '\0'; + + if (strcmp(line, "exit") == 0 || strcmp(line, "quit") == 0) { + break; + } + if (strcmp(line, "") == 0) { + printf("> "); + continue; + } + + char* source = malloc(strlen(line) + 2); + strcpy(source, line); + strcat(source, "\n"); + + static int rand_seeded = 0; + if (!rand_seeded) { + srand(time(NULL)); + rand_seeded = 1; + } + + parse_config(source); + char* clean_source = strip_config(source); + tokenize(clean_source); + current_token = 0; + + while (peek().type != TOKEN_EOF) { + execute_statement(); + } + + free(clean_source); + free(source); + printf("> "); + } + + printf("\n"); + in_repl = 0; +} + +#define VERSION_URL "https://oraset.parlz.com/download/version.txt" +#define DOWNLOAD_BASE "https://oraset.parlz.com/download" + +static char* http_get(const char* url) { +#ifdef _WIN32 + HINTERNET hInternet = InternetOpenA("Oraset", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + if (!hInternet) return NULL; + + HINTERNET hUrl = InternetOpenUrlA(hInternet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0); + if (!hUrl) { + InternetCloseHandle(hInternet); + return NULL; + } + + char* buffer = malloc(4096); + if (!buffer) { + InternetCloseHandle(hUrl); + InternetCloseHandle(hInternet); + return NULL; + } + + DWORD total_read = 0; + DWORD bytes_read; + char temp[1024]; + + while (InternetReadFile(hUrl, temp, sizeof(temp), &bytes_read) && bytes_read > 0) { + if (total_read + bytes_read >= 4095) { + char* new_buf = realloc(buffer, total_read + bytes_read + 4096); + if (!new_buf) { + free(buffer); + InternetCloseHandle(hUrl); + InternetCloseHandle(hInternet); + return NULL; + } + buffer = new_buf; + } + memcpy(buffer + total_read, temp, bytes_read); + total_read += bytes_read; + } + buffer[total_read] = '\0'; + + InternetCloseHandle(hUrl); + InternetCloseHandle(hInternet); + return buffer; +#else + char cmd[512]; + snprintf(cmd, sizeof(cmd), "curl -s \"%s\" 2>/dev/null", url); + FILE* fp = popen(cmd, "r"); + if (!fp) return NULL; + + char* buffer = malloc(4096); + if (!buffer) { + pclose(fp); + return NULL; + } + + size_t total_read = 0; + size_t bytes_read; + char temp[1024]; + + while ((bytes_read = fread(temp, 1, sizeof(temp), fp)) > 0) { + if (total_read + bytes_read >= 4095) { + char* new_buf = realloc(buffer, total_read + bytes_read + 4096); + if (!new_buf) { + free(buffer); + pclose(fp); + return NULL; + } + buffer = new_buf; + } + memcpy(buffer + total_read, temp, bytes_read); + total_read += bytes_read; + } + buffer[total_read] = '\0'; + pclose(fp); + return buffer; +#endif +} + +static int download_file(const char* url, const char* dest_path) { +#ifdef _WIN32 + HINTERNET hInternet = InternetOpenA("Oraset", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + if (!hInternet) return -1; + + HINTERNET hUrl = InternetOpenUrlA(hInternet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0); + if (!hUrl) { + InternetCloseHandle(hInternet); + return -1; + } + + FILE* fp = fopen(dest_path, "wb"); + if (!fp) { + InternetCloseHandle(hUrl); + InternetCloseHandle(hInternet); + return -1; + } + + char temp[4096]; + DWORD bytes_read; + + while (InternetReadFile(hUrl, temp, sizeof(temp), &bytes_read) && bytes_read > 0) { + fwrite(temp, 1, bytes_read, fp); + } + + fclose(fp); + InternetCloseHandle(hUrl); + InternetCloseHandle(hInternet); + return 0; +#else + char cmd[1024]; + snprintf(cmd, sizeof(cmd), "curl -L -o \"%s\" \"%s\" 2>/dev/null", dest_path, url); + return system(cmd); +#endif +} + +static void get_system_info(char* os, char* ext) { +#ifdef _WIN32 + strcpy(os, "windows"); + strcpy(ext, ".exe"); +#elif defined(__APPLE__) + strcpy(os, "macos"); + strcpy(ext, ".pkg"); +#elif defined(__linux__) + strcpy(os, "linux"); + strcpy(ext, ".tar.gz"); +#else + strcpy(os, "unknown"); + strcpy(ext, ".tar.gz"); +#endif +} + +static int compare_versions(const char* v1, const char* v2) { + int major1 = 0, minor1 = 0, patch1 = 0, major2 = 0, minor2 = 0, patch2 = 0; + char suffix1[64] = "", suffix2[64] = ""; + + sscanf(v1, "%d.%d.%d-%63s", &major1, &minor1, &patch1, suffix1); + sscanf(v2, "%d.%d.%d-%63s", &major2, &minor2, &patch2, suffix2); + + if (major1 != major2) return major1 - major2; + if (minor1 != minor2) return minor1 - minor2; + if (patch1 != patch2) return patch1 - patch2; + + int s1 = (strstr(suffix1, "Release") || strlen(suffix1) == 0) ? 3 : + (strstr(suffix1, "Beta") ? 2 : 1); + int s2 = (strstr(suffix2, "Release") || strlen(suffix2) == 0) ? 3 : + (strstr(suffix2, "Beta") ? 2 : 1); + return s1 - s2; +} + +static void trim_newline(char* str) { + int len = strlen(str); + while (len > 0 && (str[len-1] == '\n' || str[len-1] == '\r')) { + str[--len] = '\0'; + } +} + +int update_oraset(const char* target_version) { + printf("Checking for updates...\n"); + + char* version_info = http_get(VERSION_URL); + if (!version_info) { + fprintf(stderr, "Error: Cannot fetch version information.\n"); + fprintf(stderr, "Please check your internet connection.\n"); + return 1; + } + + trim_newline(version_info); + char latest_version[128]; + strncpy(latest_version, version_info, sizeof(latest_version) - 1); + free(version_info); + + printf("Current version: %s\n", VERSION); + printf("Latest version: %s\n", latest_version); + + const char* version_to_install = target_version ? target_version : latest_version; + + if (target_version) { + printf("Target version specified: %s\n", version_to_install); + } + + char os[32], ext[16]; + get_system_info(os, ext); + printf("Detected OS: %s\n", os); + + char download_url[512]; + char filename[128]; + + if (strcmp(os, "windows") == 0) { + snprintf(filename, sizeof(filename), "Oraset-B5%s", ext); + snprintf(download_url, sizeof(download_url), "%s/exe/%s", DOWNLOAD_BASE, filename); + } else if (strcmp(os, "macos") == 0) { + snprintf(filename, sizeof(filename), "Oraset-B5%s", ext); + snprintf(download_url, sizeof(download_url), "%s/pkg/%s", DOWNLOAD_BASE, filename); + } else { + snprintf(filename, sizeof(filename), "Oraset-B5%s", ext); + snprintf(download_url, sizeof(download_url), "%s/deb/%s", DOWNLOAD_BASE, filename); + } + + printf("Downloading: %s\n", download_url); + + char temp_path[512]; +#ifdef _WIN32 + char temp_dir[MAX_PATH]; + GetTempPathA(MAX_PATH, temp_dir); + snprintf(temp_path, sizeof(temp_path), "%s%s", temp_dir, filename); +#else + snprintf(temp_path, sizeof(temp_path), "/tmp/%s", filename); +#endif + + if (download_file(download_url, temp_path) != 0) { + fprintf(stderr, "Error: Failed to download update.\n"); + return 1; + } + + printf("Downloaded to: %s\n", temp_path); + +#ifdef _WIN32 + printf("Please run the installer: %s\n", temp_path); +#else + if (strcmp(os, "macos") == 0) { + printf("Installing package...\n"); + char cmd[1024]; + snprintf(cmd, sizeof(cmd), "sudo installer -pkg \"%s\" -target /", temp_path); + system(cmd); + } else if (strcmp(os, "linux") == 0) { + printf("Extracting...\n"); + char cmd[1024]; + snprintf(cmd, sizeof(cmd), "cd /tmp && tar -xzf \"%s\" && sudo cp oraset /usr/local/bin/", temp_path); + system(cmd); + } + printf("Installation complete!\n"); +#endif + + return 0; +} + +int main(int argc, char** argv) { + if (argc == 1) { + printf("Oraset B-5\n"); + printf("Usage: oraset [options]