From e691b109f21ab45bb3e440680a6bf4caf202b783 Mon Sep 17 00:00:00 2001 From: retoor Date: Sat, 22 Nov 2025 22:24:34 +0100 Subject: [PATCH] Update. --- a_test.c | 5 - demo_simple.c | 10 - demo_test.c | 12 - demo_test2.c | 22 -- demo_test3.c | 26 -- main2 | Bin 35912 -> 0 bytes main2.c | 974 -------------------------------------------------- 7 files changed, 1049 deletions(-) delete mode 100644 a_test.c delete mode 100644 demo_simple.c delete mode 100644 demo_test.c delete mode 100644 demo_test2.c delete mode 100644 demo_test3.c delete mode 100755 main2 delete mode 100644 main2.c diff --git a/a_test.c b/a_test.c deleted file mode 100644 index e03952d..0000000 --- a/a_test.c +++ /dev/null @@ -1,5 +0,0 @@ - -int main() { - printf("Starting\n"); - return 0; -} diff --git a/demo_simple.c b/demo_simple.c deleted file mode 100644 index 701c8eb..0000000 --- a/demo_simple.c +++ /dev/null @@ -1,10 +0,0 @@ - -int main() { - int server_fd; - - printf("Starting server\n"); - server_fd = socket(AF_INET(), SOCK_STREAM(), 0); - printf("Socket created\n"); - - return 0; -} diff --git a/demo_test.c b/demo_test.c deleted file mode 100644 index df59087..0000000 --- a/demo_test.c +++ /dev/null @@ -1,12 +0,0 @@ - -int main() { - int server_fd; - int client_fd; - char buffer[4096]; - - printf("Starting server\n"); - server_fd = socket(AF_INET(), SOCK_STREAM(), 0); - printf("Socket created\n"); - - return 0; -} diff --git a/demo_test2.c b/demo_test2.c deleted file mode 100644 index bd4deae..0000000 --- a/demo_test2.c +++ /dev/null @@ -1,22 +0,0 @@ - -int main() { - int server_fd; - int client_fd; - char buffer[4096]; - char *response; - int bytes_received; - int response_len; - int count; - - printf("Starting server\n"); - server_fd = socket(AF_INET(), SOCK_STREAM(), 0); - bind(server_fd, 8080); - listen(server_fd, 10); - - printf("Server listening on port 8080\n"); - - count = 0; - printf("Count initialized\n"); - - return 0; -} diff --git a/demo_test3.c b/demo_test3.c deleted file mode 100644 index aa8290f..0000000 --- a/demo_test3.c +++ /dev/null @@ -1,26 +0,0 @@ - -int main() { - int server_fd; - int client_fd; - char buffer[4096]; - char *response; - int bytes_received; - int response_len; - int count; - - server_fd = socket(AF_INET(), SOCK_STREAM(), 0); - bind(server_fd, 8080); - listen(server_fd, 10); - - printf("Server listening on port 8080\n"); - - count = 0; - while (count < 3) { - printf("Waiting for connection %d\n", count); - count = count + 1; - } - - printf("Done\n"); - close(server_fd); - return 0; -} diff --git a/main2 b/main2 deleted file mode 100755 index 3091952c63c7f363fe0aa587b3f22ef9809a1a8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35912 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 diff --git a/main2.c b/main2.c deleted file mode 100644 index 25f74c9..0000000 --- a/main2.c +++ /dev/null @@ -1,974 +0,0 @@ -/* - * Mini C Interpreter - * A concise recursive-descent interpreter in C. - * Supports: int, char*, pointers, if/else, while, functions, printf. - * Updates: Pointer declarations, improved printf, escape sequences. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_SRC 100000 -#define MAX_TOK 10000 -#define VAR_MAX 500 -#define MEM_SIZE 10000 -#define STR_POOL_SIZE 100000 - -// --- Token Types --- -enum { - Num = 128, Str, Id, Int, Char, Else, If, While, Return, Printf, - Assign, Eq, Ne, Lt, Gt, Le, Ge, Or, And -}; - -// --- Structures --- -typedef struct { - int type; - long val; // Changed to long to hold pointers on 64-bit - char *text; -} Token; - -typedef struct { - char name[32]; - int type; - int addr; - int is_array; -} Symbol; - -typedef struct { - char name[32]; - int entry_point; - int param_count; -} Func; - -typedef long (*NativeFunc)(long*, int); - -typedef struct { - char name[32]; - NativeFunc func; -} NativeFuncDef; - -// --- Globals --- -Token tokens[MAX_TOK]; -int tk_idx = 0; -int pc = 0; -long memory[MEM_SIZE]; // Changed to long -int sp = 0; -int bp = 0; - -Symbol locals[VAR_MAX]; -int loc_cnt = 0; - -Func funcs[100]; -int func_cnt = 0; - -NativeFuncDef native_funcs[100]; -int native_func_cnt = 0; - -char *src_code; - -char str_pool[STR_POOL_SIZE]; -int str_pool_idx = 0; - -// --- Tokenizer --- -void tokenize(char *src) { - char *s = src; - while (*s) { - if (isspace(*s)) { s++; continue; } - - Token *t = &tokens[tk_idx++]; - t->text = s; - - // Comments - if (*s == '/' && *(s+1) == '/') { - while (*s && *s != '\n') s++; - tk_idx--; - continue; - } - - // Keywords & Identifiers - if (isalpha(*s)) { - int len = 0; - while (isalnum(s[len]) || s[len] == '_') len++; - - char buf[32]; - strncpy(buf, s, len); buf[len] = 0; - - if (!strcmp(buf, "int")) t->type = Int; - else if (!strcmp(buf, "char")) t->type = Char; - else if (!strcmp(buf, "if")) t->type = If; - else if (!strcmp(buf, "else")) t->type = Else; - else if (!strcmp(buf, "while")) t->type = While; - else if (!strcmp(buf, "return")) t->type = Return; - else if (!strcmp(buf, "printf")) t->type = Printf; - else t->type = Id; - - t->val = len; - s += len; - continue; - } - - // Numbers - if (isdigit(*s)) { - t->type = Num; - t->val = strtol(s, &s, 10); - continue; - } - - // Strings - if (*s == '"') { - s++; - t->type = Str; - t->text = s; - - char *d = s; - while (*s && *s != '"') { - if (*s == '\\' && *(s+1) == 'n') { - *d++ = '\n'; s+=2; - } else { - *d++ = *s++; - } - } - if (*s == '"') s++; - *d = 0; - t->val = (long)(d - t->text); - continue; - } - - - // Operators - if (!strncmp(s, "==", 2)) { t->type = Eq; s += 2; continue; } - if (!strncmp(s, "!=", 2)) { t->type = Ne; s += 2; continue; } - if (!strncmp(s, "<=", 2)) { t->type = Le; s += 2; continue; } - if (!strncmp(s, ">=", 2)) { t->type = Ge; s += 2; continue; } - if (!strncmp(s, "&&", 2)) { t->type = And; s += 2; continue; } - if (!strncmp(s, "||", 2)) { t->type = Or; s += 2; continue; } - - if (*s == '<') { t->type = Lt; s++; continue; } - if (*s == '>') { t->type = Gt; s++; continue; } - - t->type = *s++; - } - tokens[tk_idx].type = 0; -} - -// --- Helpers --- -void error(char *msg) { - printf("Error at token %d ('%c'): %s\n", pc, tokens[pc].type, msg); - exit(1); -} - -void match(int type) { - if (tokens[pc].type == type) pc++; - else error("Unexpected token"); -} - -int find_local(char *name, int len) { - for (int i = loc_cnt - 1; i >= 0; i--) { - if (!strncmp(locals[i].name, name, len) && locals[i].name[len] == 0) - return i; - } - return -1; -} - -int find_func(char *name, int len) { - for (int i = 0; i < func_cnt; i++) { - if (!strncmp(funcs[i].name, name, len) && funcs[i].name[len] == 0) - return i; - } - return -1; -} - -int find_native_func(char *name, int len) { - for (int i = 0; i < native_func_cnt; i++) { - if (!strncmp(native_funcs[i].name, name, len) && native_funcs[i].name[len] == 0) - return i; - } - return -1; -} - -void register_native_func(char *name, NativeFunc func) { - NativeFuncDef *nf = &native_funcs[native_func_cnt++]; - strncpy(nf->name, name, 31); - nf->name[31] = 0; - nf->func = func; -} - -// --- Forward Declarations --- -int is_string_ptr(long val); -long slice_string(long str_ptr, int start, int end); - -// --- Parser --- -long expression(); -void statement(); - -long factor() { - Token *t = &tokens[pc]; - long val = 0; - - if (t->type == Num) { - pc++; - return t->val; - } - else if (t->type == Str) { - pc++; - return (long)t->text; - } - else if (t->type == '(') { - pc++; - val = expression(); - match(')'); - return val; - } - else if (t->type == Id) { - if (tokens[pc + 1].type == '(') { - int nf_idx = find_native_func(t->text, t->val); - - if (nf_idx != -1) { - pc += 2; - long args[10]; - int argc = 0; - - if (tokens[pc].type != ')') { - do { - args[argc++] = expression(); - } while (tokens[pc].type == ',' && pc++); - } - match(')'); - - return native_funcs[nf_idx].func(args, argc); - } - - int f_idx = find_func(t->text, t->val); - if (f_idx == -1) error("Unknown function"); - pc += 2; - - int old_bp = bp; - long args[10]; - int argc = 0; - - if (tokens[pc].type != ')') { - do { - args[argc++] = expression(); - } while (tokens[pc].type == ',' && pc++); - } - match(')'); - - int ret_pc = pc; - memory[sp] = bp; bp = sp++; - memory[sp++] = ret_pc; - for(int i=0; itext, t->val); - if (idx == -1) error("Undefined variable"); - pc++; - - Symbol *sym = &locals[idx]; - - if (tokens[pc].type == '[') { - pc++; - long start_or_index = expression(); - - if (tokens[pc].type == ':') { - pc++; - long end = expression(); - match(']'); - - long val = memory[sym->addr]; - if (is_string_ptr(val)) { - return slice_string(val, start_or_index, end); - } else { - error("Slicing only works on strings"); - } - } else { - match(']'); - return memory[sym->addr + start_or_index]; - } - } - - if (sym->is_array) { - return sym->addr; - } - - return memory[sym->addr]; - } - } - return 0; -} - -long ax = 0; - -int is_string_ptr(long val) { - return val > MEM_SIZE * 8; -} - -long concat_strings(long ptr1, long ptr2) { - char *s1 = (char*)ptr1; - char *s2 = (char*)ptr2; - char *result = &str_pool[str_pool_idx]; - - int len1 = strlen(s1); - int len2 = strlen(s2); - - if (str_pool_idx + len1 + len2 + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - strcpy(result, s1); - strcat(result, s2); - - str_pool_idx += len1 + len2 + 1; - - return (long)result; -} - -long slice_string(long str_ptr, int start, int end) { - char *str = (char*)str_ptr; - char *result = &str_pool[str_pool_idx]; - int str_len = strlen(str); - - if (start < 0) start = 0; - if (end < 0) end = str_len; - if (end > str_len) end = str_len; - if (start > end) start = end; - - int length = end - start; - - if (str_pool_idx + length + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - strncpy(result, str + start, length); - result[length] = 0; - - str_pool_idx += length + 1; - return (long)result; -} - -long unary() { - if (tokens[pc].type == '*') { - pc++; - int addr = unary(); - // CAUTION: Simplified access. - // In real C, dereferencing char* reads a byte, int* reads int. - // Here, everything is 'long' cell in memory. - // This works for the specific request but is not byte-perfect. - // Since 'b' holds an address to 'src_code' (char*), reading memory[addr] is invalid - // if addr points to 'src_code'. 'memory' array is only for stack variables. - // To support reading chars from string literals: - - // Hack for reading string characters: - // If addr is outside virtual memory range, assume it's a pointer to raw C memory (string literal) - // This is a bit unsafe but needed for "char *b" where b points to tokens. - if (addr > MEM_SIZE * 8 || addr < 0) { // Rough heuristic for external pointer - return *(char*)addr; - } - return memory[addr]; - } - else if (tokens[pc].type == '&') { - pc++; - Token *t = &tokens[pc]; - if (t->type != Id) error("Expected identifier after &"); - int idx = find_local(t->text, t->val); - if (idx == -1) error("Undefined variable"); - pc++; - return locals[idx].addr; - } - else if (tokens[pc].type == '-') { - pc++; - return -unary(); - } - return factor(); -} - -long term() { - long val = unary(); - while (tokens[pc].type == '*' || tokens[pc].type == '/') { - int op = tokens[pc++].type; - long val2 = unary(); - if (op == '*') val = val * val2; - else val = val / val2; - } - return val; -} - -long add() { - long val = term(); - while (tokens[pc].type == '+' || tokens[pc].type == '-') { - int op = tokens[pc++].type; - long val2 = term(); - if (op == '+') { - if (is_string_ptr(val) && is_string_ptr(val2)) { - val = concat_strings(val, val2); - } else { - val = val + val2; - } - } else { - val = val - val2; - } - } - return val; -} - -long relational() { - long val = add(); - while (tokens[pc].type >= Eq && tokens[pc].type <= Ge) { - int op = tokens[pc++].type; - long val2 = add(); - if (op == Eq) val = val == val2; - if (op == Ne) val = val != val2; - if (op == Lt) val = val < val2; - if (op == Gt) val = val > val2; - } - return val; -} - -long expression() { - // Check for pointer assignment: *ptr = val (Not fully robust for *b = 'x', but ok for int*) - if (tokens[pc].type == '*') { - int save_pc = pc; - unary(); - if (tokens[pc].type == '=') { - pc = save_pc; - pc++; - long addr = unary(); - match('='); - long val = expression(); - if (addr >= 0 && addr < MEM_SIZE) memory[addr] = val; - return val; - } - pc = save_pc; - } - - if (tokens[pc].type == Id) { - if (tokens[pc+1].type == '[') { - int idx = find_local(tokens[pc].text, tokens[pc].val); - if (idx == -1) error("Assign to unknown var"); - pc += 2; - long start_or_index = expression(); - - if (tokens[pc].type == ':') { - pc++; - long end = expression(); - match(']'); - - long val = memory[locals[idx].addr]; - if (is_string_ptr(val)) { - return slice_string(val, start_or_index, end); - } else { - error("Slicing only works on strings"); - } - } - - match(']'); - int addr = locals[idx].addr; - if (tokens[pc].type == '=') { - pc++; - long val = expression(); - memory[addr + start_or_index] = val; - return val; - } - return memory[addr + start_or_index]; - } else if (tokens[pc+1].type == '=') { - int idx = find_local(tokens[pc].text, tokens[pc].val); - if (idx == -1) error("Assign to unknown var"); - pc += 2; - long val = expression(); - memory[locals[idx].addr] = val; - return val; - } - } - - return relational(); -} - -void skip_block() { - int brace = 0; - do { - if (tokens[pc].type == '{') brace++; - if (tokens[pc].type == '}') brace--; - pc++; - } while (brace > 0 && tokens[pc].type != 0); -} - -void statement() { - if (tokens[pc].type == '{') { - pc++; - while (tokens[pc].type != '}' && tokens[pc].type != 0) { - statement(); - if (ax == -999) break; - } - match('}'); - } - else if (tokens[pc].type == Int || tokens[pc].type == Char) { - pc++; - while (tokens[pc].type != ';') { - while (tokens[pc].type == '*') pc++; - Token *t = &tokens[pc]; - match(Id); - - int addr = sp; - Symbol *s = &locals[loc_cnt++]; - strncpy(s->name, t->text, t->val); s->name[t->val] = 0; - s->addr = addr; - s->is_array = 0; - - if (tokens[pc].type == '[') { - pc++; - int size = (int)expression(); - match(']'); - s->is_array = 1; - sp += size; - } else { - sp++; - } - - if (tokens[pc].type == '=') { - pc++; - memory[addr] = expression(); - } - if (tokens[pc].type == ',') pc++; - } - match(';'); - } - else if (tokens[pc].type == If) { - pc++; - match('('); - long cond = expression(); - match(')'); - if (cond) { - statement(); - if (ax == -999) return; - if (tokens[pc].type == Else) { pc++; skip_block(); } - } else { - skip_block(); - if (tokens[pc].type == Else) { - pc++; - statement(); - if (ax == -999) return; - } - } - } - else if (tokens[pc].type == While) { - pc++; - int loop_start = pc; - match('('); - long cond = expression(); - match(')'); - if (!cond) { - skip_block(); - } else { - while (1) { - statement(); - if (ax == -999) return; - int save_pc = pc; - pc = loop_start; - match('('); - cond = expression(); - match(')'); - if (!cond) { pc = save_pc; break; } - } - } - } - else if (tokens[pc].type == Return) { - pc++; - if (tokens[pc].type != ';') ax = expression(); - else ax = 0; - match(';'); - ax = -999; - } - else if (tokens[pc].type == Printf) { - pc++; - match('('); - char *fmt = tokens[pc].text; // Get raw format string - match(Str); - - char *p = fmt; - while (*p) { - if (*p == '%' && (p[1] == 'd' || p[1] == 's')) { - p++; // skip % - match(','); - long val = expression(); - if (*p == 'd') printf("%ld", val); - else if (*p == 's') printf("%s", (char*)val); - p++; // skip d or s - } else { - putchar(*p++); - } - } - match(')'); - match(';'); - } - else { - expression(); - match(';'); - } -} - -void scan_functions() { - int i = 0; - while (tokens[i].type != 0) { - // Simple scan: Type Id ( ... - if ((tokens[i].type == Int || tokens[i].type == Char) && - tokens[i+1].type == Id && tokens[i+2].type == '(') { - - Func *f = &funcs[func_cnt++]; - Token *name = &tokens[i+1]; - strncpy(f->name, name->text, name->val); f->name[name->val] = 0; - - i += 3; // Type Id ( - int params = 0; - while(tokens[i].type != ')') { - if (tokens[i].type == Int || tokens[i].type == Char) { - params++; - // Skip 'char * name' or 'int name' - i++; // Type - while (tokens[i].type == '*') i++; - if (tokens[i].type == Id) i++; - } else i++; - } - f->param_count = params; - i++; - f->entry_point = i; - - int brace = 0; - do { - if (tokens[i].type == '{') brace++; - if (tokens[i].type == '}') brace--; - i++; - } while (brace > 0 && tokens[i].type != 0); - } else { - i++; - } - } -} - -long native_socket(long *args, int argc) { - int domain = (int)args[0]; - int type = (int)args[1]; - int protocol = (int)args[2]; - return socket(domain, type, protocol); -} - -long native_bind(long *args, int argc) { - int sockfd = (int)args[0]; - int port = (int)args[1]; - - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = INADDR_ANY; - addr.sin_port = htons(port); - - return bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)); -} - -long native_listen(long *args, int argc) { - int sockfd = (int)args[0]; - int backlog = (int)args[1]; - return listen(sockfd, backlog); -} - -long native_accept(long *args, int argc) { - int sockfd = (int)args[0]; - return accept(sockfd, NULL, NULL); -} - -long native_recv(long *args, int argc) { - int sockfd = (int)args[0]; - int addr = (int)args[1]; - int len = (int)args[2]; - int flags = (int)args[3]; - - char temp_buf[8192]; - if (len > 8192) len = 8192; - - int result = recv(sockfd, temp_buf, len, flags); - if (result > 0) { - for (int i = 0; i < result; i++) { - memory[addr + i] = temp_buf[i]; - } - } - return result; -} - -long native_send(long *args, int argc) { - int sockfd = (int)args[0]; - long buf_arg = args[1]; - int len = (int)args[2]; - int flags = (int)args[3]; - - if (buf_arg > MEM_SIZE * 8 || buf_arg < 0) { - return send(sockfd, (char*)buf_arg, len, flags); - } - - char temp_buf[8192]; - if (len > 8192) len = 8192; - - for (int i = 0; i < len; i++) { - temp_buf[i] = (char)memory[buf_arg + i]; - } - - return send(sockfd, temp_buf, len, flags); -} - -long native_close(long *args, int argc) { - int fd = (int)args[0]; - return close(fd); -} - -long native_strlen(long *args, int argc) { - char *str = (char*)args[0]; - return strlen(str); -} - -long native_AF_INET(long *args, int argc) { - return AF_INET; -} - -long native_SOCK_STREAM(long *args, int argc) { - return SOCK_STREAM; -} - -long native_sqrt(long *args, int argc) { - return (long)sqrt((double)args[0]); -} - -long native_pow(long *args, int argc) { - return (long)pow((double)args[0], (double)args[1]); -} - -long native_sin(long *args, int argc) { - return (long)(sin((double)args[0]) * 1000000); -} - -long native_cos(long *args, int argc) { - return (long)(cos((double)args[0]) * 1000000); -} - -long native_tan(long *args, int argc) { - return (long)(tan((double)args[0]) * 1000000); -} - -long native_abs(long *args, int argc) { - return (long)abs((int)args[0]); -} - -long native_floor(long *args, int argc) { - return (long)floor((double)args[0]); -} - -long native_ceil(long *args, int argc) { - return (long)ceil((double)args[0]); -} - -long native_strpos(long *args, int argc) { - char *haystack = (char*)args[0]; - char *needle = (char*)args[1]; - char *pos = strstr(haystack, needle); - if (pos) { - return pos - haystack; - } - return -1; -} - -long native_substr(long *args, int argc) { - char *str = (char*)args[0]; - int start = (int)args[1]; - int length = (int)args[2]; - - char *result = &str_pool[str_pool_idx]; - int str_len = strlen(str); - - if (start < 0) start = 0; - if (start >= str_len) return (long)""; - if (start + length > str_len) length = str_len - start; - if (length < 0) return (long)""; - - if (str_pool_idx + length + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - strncpy(result, str + start, length); - result[length] = 0; - - str_pool_idx += length + 1; - return (long)result; -} - -long native_upper(long *args, int argc) { - char *str = (char*)args[0]; - char *result = &str_pool[str_pool_idx]; - int len = strlen(str); - - if (str_pool_idx + len + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - for (int i = 0; i <= len; i++) { - result[i] = toupper(str[i]); - } - - str_pool_idx += len + 1; - return (long)result; -} - -long native_lower(long *args, int argc) { - char *str = (char*)args[0]; - char *result = &str_pool[str_pool_idx]; - int len = strlen(str); - - if (str_pool_idx + len + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - for (int i = 0; i <= len; i++) { - result[i] = tolower(str[i]); - } - - str_pool_idx += len + 1; - return (long)result; -} - -long native_strip(long *args, int argc) { - char *str = (char*)args[0]; - char *result = &str_pool[str_pool_idx]; - - while (*str && isspace(*str)) str++; - - int len = strlen(str); - while (len > 0 && isspace(str[len - 1])) len--; - - if (str_pool_idx + len + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - - strncpy(result, str, len); - result[len] = 0; - - str_pool_idx += len + 1; - return (long)result; -} - -long native_replace(long *args, int argc) { - char *str = (char*)args[0]; - char *old_str = (char*)args[1]; - char *new_str = (char*)args[2]; - - char *result = &str_pool[str_pool_idx]; - char *src = str; - char *dst = result; - int old_len = strlen(old_str); - int new_len = strlen(new_str); - - while (*src) { - if (strncmp(src, old_str, old_len) == 0) { - if (str_pool_idx + (dst - result) + new_len + strlen(src + old_len) + 1 >= STR_POOL_SIZE) { - error("String pool overflow"); - } - strcpy(dst, new_str); - dst += new_len; - src += old_len; - } else { - *dst++ = *src++; - } - } - *dst = 0; - - int total_len = dst - result; - str_pool_idx += total_len + 1; - return (long)result; -} - -long native_startswith(long *args, int argc) { - char *str = (char*)args[0]; - char *prefix = (char*)args[1]; - int prefix_len = strlen(prefix); - return strncmp(str, prefix, prefix_len) == 0; -} - -long native_endswith(long *args, int argc) { - char *str = (char*)args[0]; - char *suffix = (char*)args[1]; - int str_len = strlen(str); - int suffix_len = strlen(suffix); - - if (suffix_len > str_len) return 0; - return strcmp(str + str_len - suffix_len, suffix) == 0; -} - -void register_native_functions() { - register_native_func("socket", native_socket); - register_native_func("bind", native_bind); - register_native_func("listen", native_listen); - register_native_func("accept", native_accept); - register_native_func("recv", native_recv); - register_native_func("send", native_send); - register_native_func("close", native_close); - register_native_func("strlen", native_strlen); - register_native_func("AF_INET", native_AF_INET); - register_native_func("SOCK_STREAM", native_SOCK_STREAM); - register_native_func("sqrt", native_sqrt); - register_native_func("pow", native_pow); - register_native_func("sin", native_sin); - register_native_func("cos", native_cos); - register_native_func("tan", native_tan); - register_native_func("abs", native_abs); - register_native_func("floor", native_floor); - register_native_func("ceil", native_ceil); - register_native_func("strpos", native_strpos); - register_native_func("substr", native_substr); - register_native_func("upper", native_upper); - register_native_func("lower", native_lower); - register_native_func("strip", native_strip); - register_native_func("replace", native_replace); - register_native_func("startswith", native_startswith); - register_native_func("endswith", native_endswith); -} - -int main(int argc, char **argv) { - if (argc < 2) { printf("Usage: ./mini_c file.c\n"); return 1; } - - FILE *f = fopen(argv[1], "rb"); - if (!f) { printf("Could not open file.\n"); return 1; } - - src_code = malloc(MAX_SRC); - size_t n = fread(src_code, 1, MAX_SRC, f); - src_code[n] = 0; - fclose(f); - - register_native_functions(); - - tokenize(src_code); - scan_functions(); - - int main_idx = find_func("main", 4); - if (main_idx == -1) { printf("No main function found.\n"); return 1; } - - pc = funcs[main_idx].entry_point; - memory[sp++] = 0; - memory[sp++] = 0; - - ax = 0; - statement(); - - return 0; -}