From fab64a5ae0b5dff747caba9d9a2189d55d8904bf Mon Sep 17 00:00:00 2001 From: "Emilia(SleepeeSoftware)" Date: Wed, 4 Mar 2026 04:14:34 +0100 Subject: [PATCH] wokring up to current status, used some ia to help me comment and refine some logic, need some more work on my part not yet as good as i want --- README.md | 8 + a.exe | Bin 0 -> 65198 bytes include/SterlingCompiler.h | 60 ++++--- source/list.h | 150 ++++++++++++++++++ source/main.c | 316 +++++++++++++++++++++++++++++-------- 5 files changed, 446 insertions(+), 88 deletions(-) create mode 100644 README.md create mode 100644 a.exe create mode 100644 source/list.h diff --git a/README.md b/README.md new file mode 100644 index 0000000..627e4af --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Sterling + +`i am delusionnal !!! don't take me seriously` + +ptr : addr : 64bit +arr : addr + size : 128bit + + diff --git a/a.exe b/a.exe new file mode 100644 index 0000000000000000000000000000000000000000..40940e7be6ac85da694916dfa9dab50ced60907c GIT binary patch literal 65198 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 #include #include #include #include #include +#include + +//simd +# ifdef __x86_64__ +# include +# endif + +typedef enum { + TOK_NONE, + TOK_STRING, + TOK_RAW, + TOK_PREPROCESSOR, +} TKN_CTX; + +typedef struct Token_s { + int size; + TKN_CTX ctx; + char *data; +} Token_t; + +//builtin type: if x86_64, then since i use simd, should align them + +typedef struct vec2 { + float x; + float y; + float _padding1; + float _padding2; +} __attribute__((aligned(16)));//losing 8 byte + +typedef struct vec3 { + float x; + float y; + float z; + float _padding; +} __attribute__((aligned(16)));//losing 4 byte + +typedef struct vec4 { + float x; + float y; + float z; + float w; +} __attribute__((aligned(16))); #endif diff --git a/source/list.h b/source/list.h new file mode 100644 index 0000000..a45a824 --- /dev/null +++ b/source/list.h @@ -0,0 +1,150 @@ +#ifndef LIST_H +# define LIST_H + +#include +#include +#include +#include + +typedef struct node_s { + void *data; + struct node_s *next; +} node_t; + +typedef struct { + int size; + node_t *first; + node_t *last; +} list_t; + +typedef struct { + node_t *current; +} list_iter_t; + + +list_t *ListInit(list_t *lst); +void ListInsert(list_t *lst, size_t idx, void *data); +void ListPushBack(list_t *lst, void *data); +list_iter_t ListGetIter(const list_t *lst); +void *ListAdvance(list_iter_t *it); +void *ListPeek(const list_iter_t *it); +void *ListPeekNext(const list_iter_t *it); +bool ListAtEnd(const list_iter_t *it); +void ListReset(list_iter_t *it, const list_t *lst); +void ListFree(list_t *lst, void (*free_func)(void*)); +void *ListPeekK(const list_iter_t *it, size_t k); +void ListRestore(list_iter_t *it, const list_iter_t checkpoint); +bool ListMatch(list_iter_t *it, bool (*predicate)(void*, void*), void *target); + +# ifdef LIST_IMPLEMENTATION + +list_t *ListInit(list_t *lst) { + if (!lst) { + lst = (list_t *)malloc(sizeof(list_t)); + } + lst->first = NULL; + lst->last = NULL; + lst->size = 0; + return (lst); +} + +void ListInsert(list_t *lst, size_t idx, void *data) { + node_t *node = (node_t *)malloc(sizeof(node_t)); + node->data = data; + node->next = 0; + if (lst->size == 0) { + lst->first = lst->last = node; + } else if (idx == 0) { + node->next = lst->first; + lst->first = node; + } else { + node_t *prev = lst->first; + for (int i = 0; i < idx - 1 && prev->next; i++) { + prev = prev->next; + } + node->next = prev->next; + prev->next = node; + if (node->next == NULL) { + lst->last = node; + } + } + + lst->size++; +} + +void ListPushBack(list_t *lst, void *data) { + node_t *node = (node_t *)malloc(sizeof(node_t)); + node->data = data; + node->next = NULL; + + if (!lst->first) { + lst->first = node; + } else { + lst->last->next = node; + } + lst->last = node; + lst->size++; +} + +list_iter_t ListGetIter(const list_t *lst) { + return ((list_iter_t){.current = lst->first}); +} + +void *ListAdvance(list_iter_t *it) { + if (!it->current) return NULL; + void *data = it->current->data; + it->current = it->current->next; + return (data); +} + +void *ListPeek(const list_iter_t *it) { + return (it->current ? it->current->data : NULL); +} + +void *ListPeekNext(const list_iter_t *it) { + return (it->current ? (it->current->next ? it->current->next->data : NULL) : NULL); +} + +bool ListAtEnd(const list_iter_t *it) { + return (it->current == NULL); +} + +void ListReset(list_iter_t *it, const list_t *lst) { + it->current = lst->first; +} + +void ListFree(list_t *lst, void (*free_func)(void*)) { + node_t *current = lst->first; + while (current) { + node_t *next = current->next; + if (free_func) free_func(current->data); + free(current); + current = next; + } + lst->size = 0; + lst->first = lst->last = NULL; +} + +void *ListPeekK(const list_iter_t *it, size_t k) { + node_t *current = it->current; + for (size_t i = 0; i < k && current; i++) { + current = current->next; + } + return (current ? current->data : NULL); +} + +void ListRestore(list_iter_t *it, const list_iter_t checkpoint) { + it->current = checkpoint.current; +} + +bool ListMatch(list_iter_t *it, bool (*predicate)(void*, void*), void *target) { + if (it->current && predicate(it->current->data, target)) { + ListAdvance(it); + return true; + } + return false; +} + +# endif + +#endif diff --git a/source/main.c b/source/main.c index efc5d57..59c46c9 100644 --- a/source/main.c +++ b/source/main.c @@ -1,93 +1,269 @@ -#include +#define LIST_IMPLEMENTATION +#include "list.h" + +#include "../include/SterlingCompiler.h" char *LoadFile(const char *filename) { - char *data = NULL; FILE *file = NULL; - const int buff_size = 2048;//may change for max size of file in character - char buffer[buff_size]; - int count = 0; + char *data = NULL; file = fopen(filename, "r"); - count = fread(buffer, 1, buff_size, file); - data = calloc(count + 1, sizeof(char)); - memcpy(data, buffer, count); + assert(file); + fseek(file, 0, SEEK_END); + long size = ftell(file); + fseek(file, 0, SEEK_SET); + data = (char *)malloc(size + 1); + assert(data); + fread(data, 1, size, file); + data[size] = 0x00; fclose(file); return (data); } -TokenList SeparateString(char *data) { - char *span = NULL; - char *tok = NULL; - char *tmp = NULL; - bool toggle = false; - Token_t buffer[256]; - tok = strtok_r(data, "\"\'", &span); - int i = 0; - buffer[i].ctx = TOK_NONE; - while (tok && i < (sizeof(buffer) / sizeof(Token_t))) { - size_t size = (span - tok); - tmp = calloc(size + 1, sizeof(char)); - memcpy_s(tmp, size, tok, size); - tmp[size] = 0x00; - buffer[i].data = tmp; - buffer[i].size = size; - if (toggle) { - buffer[i].ctx = TOK_STRING; - } else { - buffer[i].ctx = TOK_NONE; - } - tok = strtok_r(NULL, "\"\'", &span); - i++; - toggle ^= toggle; +# ifndef strndup +char *strndup(const char *s, size_t n) { + char *str = calloc(n + 1, sizeof(char)); + memcpy(str, s, n); + return (str); +} +# endif - } - TokenList token_list; - token_list.token = calloc(i, sizeof(Token_t)); - token_list.size = i; - memcpy(token_list.token, buffer, i); - for (int k = 0; k < i; k++) { - token_list.token[k] = buffer[i]; - } - return (token_list); +bool IsWhitespace(const char *s) { + while (*s) { + if (!isspace((unsigned char)*s)) return false; + s++; + } + return true; } -void tmpFunction() { - char* data = NULL; - char* span = NULL; - char* tmp = NULL; - char* delim = " \t\n"; - char* special = ";#"; - size_t size = 0; - char* tok = strtok_r(data, delim, &span); - while (tok) { - size = (span - tok); - tmp = malloc(size + 1); - memcpy_s(tmp, size, tok, size); - tmp[size] = 0x00; - printf("|%s|\n", tmp); - free(tmp); - tok = strtok_r(NULL, " \t\n", &span); - } +void ClearTokens(void*arg) { + Token_t *tok = arg; + free(tok->data); + free(tok); } +// Helper to create and link a new token +void PushToken(char *start, char *end, TKN_CTX ctx, list_t *lst) { + size_t len = end - start; + Token_t *t = calloc(1, sizeof(Token_t)); + t->data = malloc(len + 1); + memcpy(t->data, start, len); + ((char*)t->data)[len] = '\0'; + t->size = len; + t->ctx = ctx; + ListPushBack(lst, t); +} + +// Helper to push code that still needs to be refined +void PushRaw(char *start, char *end, list_t *lst) { + if (end <= start) return; + PushToken(start, end, TOK_RAW, lst); +} + +void SeparateStrings(char *data, list_t *tkn_lst) { + char *curr = data; + char *start = data; + + while (*curr != '\0') { + // If we find a quote, we need to "package" the raw code before it, + // then package the string itself. + if (*curr == '\"' || *curr == '\'') { + char quote_type = *curr; + + // 1. Save the "Raw" chunk before the string + if (curr > start) { + size_t raw_len = curr - start; + Token_t *raw = calloc(1, sizeof(Token_t)); + raw->data = strndup(start, raw_len); // strndup is C99/POSIX + raw->size = raw_len; + raw->ctx = TOK_RAW; + ListPushBack(tkn_lst, raw); + } + + // 2. Find the end of the string + char *str_start = curr; + curr++; // Skip opening quote + while (*curr != '\0' && *curr != quote_type) { + if (*curr == '\\') curr++; // Skip escaped characters like \" + curr++; + } + if (*curr == quote_type) curr++; // Include closing quote + + // 3. Save the String Token + size_t str_len = curr - str_start; + Token_t *str_tok = calloc(1, sizeof(Token_t)); + str_tok->data = strndup(str_start, str_len); + str_tok->size = str_len; + str_tok->ctx = TOK_STRING; + ListPushBack(tkn_lst, str_tok); + + start = curr; // Reset start to the character after the string + } else { + curr++; + } + } + + // 4. Catch any remaining raw code after the last string + if (curr > start) { + size_t last_len = curr - start; + Token_t *last = calloc(1, sizeof(Token_t)); + last->data = strndup(start, last_len); + last->size = last_len; + last->ctx = TOK_RAW; + ListPushBack(tkn_lst, last); + } +} + +void InitialScanner(char *data, list_t *tkn_lst) { + char *curr = data; + char *start = data; + + while (*curr != '\0') { + // 1. Handle Strings + if (*curr == '\"' || *curr == '\'') { + PushRaw(start, curr, tkn_lst); // Save code before string + char quote = *curr; + char *str_start = curr++; + while (*curr && *curr != quote) { + if (*curr == '\\' && *(curr + 1)) curr++; // Skip escaped char + curr++; + } + if (*curr) curr++; + PushToken(str_start, curr, TOK_STRING, tkn_lst); + start = curr; + } + // 2. Handle Comments + else if (*curr == '/' && (*(curr + 1) == '/' || *(curr + 1) == '*')) { + PushRaw(start, curr, tkn_lst); // Save code before comment + + if (*(curr + 1) == '/') { // Single line // + while (*curr && *curr != '\n') curr++; + curr++;//for skipping the \n + } else { // Multi-line /* + curr += 2; + while (*curr && !(*curr == '*' && *(curr + 1) == '/')) curr++; + if (*curr) curr += 2; // Move past */ + } + // We DON'T push a token here because we want to ignore comments. + // If you want to keep them (for a doc-generator), push a TOK_COMMENT. + start = curr; + } + else { + curr++; + } + } + PushRaw(start, curr, tkn_lst); // Catch the tail +} + +void RefineRawNodes(list_t *tkn_lst) { + node_t *curr = tkn_lst->first; + node_t *prev = NULL; + + while (curr) { + Token_t *t = (Token_t *)curr->data; + + // Only process RAW chunks; leave TOK_STRING nodes alone! + if (t->ctx == TOK_RAW) { + char *span = NULL; + // Note: We use a copy because strtok modifies the string + char *to_split = _strdup(t->data); + char *tok = strtok_r(to_split, " \t\r\n", &span); + + if (tok) { + // 1. Update the current node's data with the FIRST token found + free(t->data); + t->data = _strdup(tok); + t->size = strlen(tok); + + node_t *last_inserted = curr; + tok = strtok_r(NULL, " \t\r\n", &span); + + // 2. Insert NEW nodes for the rest of the tokens + while (tok) { + Token_t *new_t = calloc(1, sizeof(Token_t)); + new_t->data = _strdup(tok); + new_t->size = strlen(tok); + new_t->ctx = TOK_RAW; + + node_t *new_node = calloc(1, sizeof(node_t)); + new_node->data = new_t; + + // Insert into the list + new_node->next = last_inserted->next; + last_inserted->next = new_node; + + if (tkn_lst->last == last_inserted) tkn_lst->last = new_node; + + last_inserted = new_node; + tkn_lst->size++; + tok = strtok_r(NULL, " \t\r\n", &span); + } + curr = last_inserted; // Move cursor to the end of the new chain + } + free(to_split); + } + + prev = curr; + curr = curr->next; + } +} + +void PruneWhitespaceNodes(list_t *lst) { + node_t *curr = lst->first; + node_t *prev = NULL; + + while (curr) { + Token_t *t = (Token_t *)curr->data; + if (t->ctx == TOK_RAW && IsWhitespace(t->data)) { + // Unlink and free + node_t *temp = curr; + if (prev) prev->next = curr->next; + else lst->first = curr->next; + + if (lst->last == temp) lst->last = prev; + + curr = curr->next; + ClearTokens(temp->data); + free(temp); + lst->size--; + } else { + prev = curr; + curr = curr->next; + } + } +} + + int main(int ac, char **av) { if (ac <= 1) { printf("no file specified"); return (-1); } char* data = LoadFile(av[1]); - TokenList tkn_lst; - //first pass on string - tkn_lst = SeparateString(data); - //second pass on ; and \n - //third pass on \t and space - //give each token a context - //let's replace preprocessor - //let's do recursive parsing everywhere that need it - //compile time reflection - //metaprogramming logic annotation if i do it lastly - for (int i = 0; i < tkn_lst.size; i++) { - free(tkn_lst.token[i].data); + list_t *tkn_lst = ListInit(NULL); + //first pass on string, whitespace and comments + InitialScanner(data, tkn_lst); + //SeparateStrings(data, tkn_lst); + list_iter_t iter = ListGetIter(tkn_lst); + while (iter.current) { + printf("|%s|", ((Token_t *)iter.current->data)->data); + iter.current = iter.current->next; } + PruneWhitespaceNodes(tkn_lst); + printf("\n___\n"); + RefineRawNodes(tkn_lst); + ListReset(&iter, tkn_lst); + while (iter.current) { + printf("|%s|\n", ((Token_t *)iter.current->data)->data); + iter.current = iter.current->next; + } + //pass on ";(){}[]$%&*$#@!?:,.<>|_-+=~`" + //give each token a context + //let's replace preprocessor (include, define, etc) + //let's do recursive parsing everywhere that need it + //compile time reflection (@comptime or @reflect) + //metaprogramming logic annotation if i do it lastly** may not be + ListFree(tkn_lst, ClearTokens); free(data); return(0); } +//test