From 14b0bbbf47bee306c304095247a8161cb5bcc2fc Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 12 May 2020 18:33:38 -0500 Subject: [PATCH] Commiting at end of day. Working on rewriting the bh_string library to include better support for C-strs --- bh.h | 58 ++++++++++++++++++++++++++++--------------------- docs/plan | 9 ++++---- onyx | Bin 41936 -> 41536 bytes onyx.c | 6 ++++- onyxlex.c | 12 ++++++++++ onyxlex.h | 6 +++++ progs/mvp.onyx | 10 ++++----- 7 files changed, 66 insertions(+), 35 deletions(-) diff --git a/bh.h b/bh.h index c322aa80..f6574665 100644 --- a/bh.h +++ b/bh.h @@ -1,7 +1,6 @@ #ifndef BH_H #define BH_H -#include #include #include #include @@ -43,15 +42,19 @@ i64 chars_match(char* ptr1, char* ptr2); #define bh_max(a, b) ((a) > (b) ? (a) : (b)) #define bh_min(a, b) ((a) < (b) ? (a) : (b)) #define bh_clamp(v, a, b) (bh_min((b), bh_max((a), (v)))) +#define bh_abs(x) ((x) < 0 ? -(x) : (x)) //------------------------------------------------------------------------------------- // Better strings //------------------------------------------------------------------------------------- -typedef struct bh_string { - u8* data; +typedef struct bh__string { u64 length; u64 capacity; -} bh_string; +} bh__string; + +typedef char bh_string; + +#define bh__stringhead(x) (((bh__string *)(x)) - 1) #define bh_string_new(x) _Generic((x), \ unsigned long: bh_string_new_cap, \ @@ -266,47 +269,52 @@ i64 chars_match(char* ptr1, char* ptr2) { //------------------------------------------------------------------------------------- // STRING IMPLEMENTATION //------------------------------------------------------------------------------------- -bh_string bh_string_new_cap(unsigned long cap) { - bh_string str; - str.data = (u8*) malloc(sizeof(u8) * cap); - str.length = 0; - str.capacity = cap; - return str; +bh_string* bh_string_new_cap(unsigned long cap) { + bh__string* str; + str = (bh__string*) malloc(sizeof(*str) + sizeof(char) * cap + 1); + str[0] = 0; + return str + 1; } -bh_string bh_string_new_str(const char* cstr) { +bh_string* bh_string_new_str(const char* cstr) { const i32 len = strlen(cstr); - bh_string str; + bh__string* str; i32 i; - str.data = (u8*) malloc(sizeof(u8) * len); + str = malloc(sizeof(*str) + sizeof(char) * len + 1); + char* data = (char*) (str + 1); for (i = 0; i < len; i++) { - str.data[i] = cstr[i]; + data[i] = cstr[i]; } - str.length = len; - str.capacity = len; - return str; + data[i] = 0; // Always null terminate the string + + str->length = len; + str->capacity = len; + return str + 1; } -b32 bh_string_delete(bh_string* str) { - free(str->data); +b32 bh_string_delete(bh_string** str) { + bh__string* strptr = bh__stringhead(*str); + free(strptr); str->length = 0; str->capacity = 0; return 1; } -b32 bh_string_ensure_capacity(bh_string* str, u64 cap) { - if (str->capacity >= cap) return 1; +b32 bh_string_grow(bh_string** str, u64 cap) { + bh__string* strptr = bh__stringhead(*str); + if (strptr->capacity >= cap) return 1; + + void* p; + p = realloc(strptr, sizeof(*strptr) + sizeof(char) * cap + 1); - //TODO: This could fail - str->data = (u8*) realloc((void*) str->data, sizeof(u8) * cap); - str->capacity = cap; + strptr->capacity = cap; return 1; } -void bh_string_append_bh_string(bh_string* str1, bh_string* str2) { +void bh_string_append_bh_string(bh_string** str1, bh_string** str2) { if (!bh_string_ensure_capacity(str1, str1->length + str2->length)) return; //TODO: Replace with custom memory management diff --git a/docs/plan b/docs/plan index 70cd353e..666e18db 100644 --- a/docs/plan +++ b/docs/plan @@ -40,14 +40,15 @@ foo :: (a: i32) -> Foo { MVP CODE: -// Comments need to be parsed +/* Comments need to be parsed */ -export add :: (a: i32, b: i32) -> i32 { +export proc add :: (a i32, b i32) -> i32 { return a + b; } -export max :: (a: i32, b: i32) -> i32 { - // Curly braces are required +export proc max :: (a i32, b i32) -> i32 { + /* Curly braces are required */ + if a > b { return a; } else { diff --git a/onyx b/onyx index 690a2c823d61c7cd3aca2909c5a31d6a81f43638..e6cb94a24b220508298f7e54c473440ad335c933 100755 GIT binary patch literal 41536 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 diff --git a/onyx.c b/onyx.c index d4b8f88e..32e38f5b 100644 --- a/onyx.c +++ b/onyx.c @@ -15,7 +15,7 @@ bh_arr(Token) parse_tokens(bh_file_contents *fc) { }; bh_arr(Token) token_arr = NULL; - bh_arr_grow(token_arr, 1024); + bh_arr_grow(token_arr, 512); Token tk; do { @@ -41,6 +41,10 @@ int main(int argc, char *argv[]) { printf("There are %d tokens (Allocated space for %d tokens)\n", bh_arr_length(token_arr), bh_arr_capacity(token_arr)); + for (Token* it = token_arr; !bh_arr_end(token_arr, it); it++) { + printf("%s\n", get_token_type_name(*it)); + } + bh_file_contents_delete(&fc); bh_arr_free(token_arr); diff --git a/onyxlex.c b/onyxlex.c index 38c54c4c..af930ded 100644 --- a/onyxlex.c +++ b/onyxlex.c @@ -13,8 +13,11 @@ static const char* TokenTypeNames[] = { "TOKEN_TYPE_KEYWORD_IF", "TOKEN_TYPE_KEYWORD_ELSE", "TOKEN_TYPE_KEYWORD_FOR", + "TOKEN_TYPE_KEYWORD_DO", "TOKEN_TYPE_KEYWORD_RETURN", "TOKEN_TYPE_KEYWORD_FOREIGN", + "TOKEN_TYPE_KEYWORD_PROC", + "TOKEN_TYPE_KEYWORD_GLOBAL", "TOKEN_TYPE_RIGHT_ARROW", "TOKEN_TYPE_LEFT_ARROW", @@ -33,6 +36,7 @@ static const char* TokenTypeNames[] = { "TOKEN_TYPE_SYM_PERCENT", "TOKEN_TYPE_SYM_FSLASH", "TOKEN_TYPE_SYM_BSLASH", + "TOKEN_TYPE_SYM_TYPE_SIGNATURE", "TOKEN_TYPE_SYM_COLON", "TOKEN_TYPE_SYM_SEMICOLON", "TOKEN_TYPE_SYM_COMMA", @@ -40,6 +44,8 @@ static const char* TokenTypeNames[] = { "TOKEN_TYPE_SYM_GRAVE", "TOKEN_TYPE_SYM_TILDE", "TOKEN_TYPE_SYM_BANG", + "TOKEN_TYPE_SYM_CARET", + "TOKEN_TYPE_SYM_AMPERSAND", "TOKEN_TYPE_SYMBOL", "TOKEN_TYPE_LITERAL_STRING", @@ -142,6 +148,9 @@ Token get_token(Tokenizer* tokenizer) { LITERAL_TOKEN("foreign", TOKEN_TYPE_KEYWORD_FOREIGN); LITERAL_TOKEN("for", TOKEN_TYPE_KEYWORD_FOR); LITERAL_TOKEN("return", TOKEN_TYPE_KEYWORD_RETURN); + LITERAL_TOKEN("do", TOKEN_TYPE_KEYWORD_DO); + LITERAL_TOKEN("proc", TOKEN_TYPE_KEYWORD_PROC); + LITERAL_TOKEN("global", TOKEN_TYPE_KEYWORD_GLOBAL); LITERAL_TOKEN("->", TOKEN_TYPE_RIGHT_ARROW); LITERAL_TOKEN("<-", TOKEN_TYPE_RIGHT_ARROW); LITERAL_TOKEN("(", TOKEN_TYPE_OPEN_PAREN); @@ -158,6 +167,7 @@ Token get_token(Tokenizer* tokenizer) { LITERAL_TOKEN("/", TOKEN_TYPE_SYM_FSLASH); LITERAL_TOKEN("%", TOKEN_TYPE_SYM_PERCENT); LITERAL_TOKEN("\\", TOKEN_TYPE_SYM_BSLASH); + LITERAL_TOKEN("::", TOKEN_TYPE_SYM_TYPE_SIGNATURE); LITERAL_TOKEN(":", TOKEN_TYPE_SYM_COLON); LITERAL_TOKEN(";", TOKEN_TYPE_SYM_SEMICOLON); LITERAL_TOKEN(",", TOKEN_TYPE_SYM_COMMA); @@ -165,6 +175,8 @@ Token get_token(Tokenizer* tokenizer) { LITERAL_TOKEN("`", TOKEN_TYPE_SYM_GRAVE); LITERAL_TOKEN("~", TOKEN_TYPE_SYM_TILDE); LITERAL_TOKEN("!", TOKEN_TYPE_SYM_BANG); + LITERAL_TOKEN("^", TOKEN_TYPE_SYM_CARET); + LITERAL_TOKEN("&", TOKEN_TYPE_SYM_AMPERSAND); // Symbols if (char_is_alpha(*tk.token)) { diff --git a/onyxlex.h b/onyxlex.h index 8fb15967..608d133b 100644 --- a/onyxlex.h +++ b/onyxlex.h @@ -23,8 +23,11 @@ typedef enum TokenType { TOKEN_TYPE_KEYWORD_IF, TOKEN_TYPE_KEYWORD_ELSE, TOKEN_TYPE_KEYWORD_FOR, + TOKEN_TYPE_KEYWORD_DO, TOKEN_TYPE_KEYWORD_RETURN, TOKEN_TYPE_KEYWORD_FOREIGN, + TOKEN_TYPE_KEYWORD_PROC, + TOKEN_TYPE_KEYWORD_GLOBAL, TOKEN_TYPE_RIGHT_ARROW, TOKEN_TYPE_LEFT_ARROW, @@ -43,6 +46,7 @@ typedef enum TokenType { TOKEN_TYPE_SYM_PERCENT, TOKEN_TYPE_SYM_FSLASH, TOKEN_TYPE_SYM_BSLASH, + TOKEN_TYPE_SYM_TYPE_SIGNATURE, TOKEN_TYPE_SYM_COLON, TOKEN_TYPE_SYM_SEMICOLON, TOKEN_TYPE_SYM_COMMA, @@ -50,6 +54,8 @@ typedef enum TokenType { TOKEN_TYPE_SYM_GRAVE, TOKEN_TYPE_SYM_TILDE, TOKEN_TYPE_SYM_BANG, + TOKEN_TYPE_SYM_CARET, + TOKEN_TYPE_SYM_AMPERSAND, TOKEN_TYPE_SYMBOL, TOKEN_TYPE_LITERAL_STRING, diff --git a/progs/mvp.onyx b/progs/mvp.onyx index cf693c37..1a8d8c00 100644 --- a/progs/mvp.onyx +++ b/progs/mvp.onyx @@ -2,13 +2,13 @@ /* nested comments /* are /* okay */ */ */ */ -foreign "console" "log" :: (ptr, i32) -> void; +foreign proc "console" "log" :: (data ptr, length i32) -> void; -export add :: (a i32, b i32) -> i32 { +export proc add :: (a i32, b i32) -> i32 { return a + b; -} +}; -export max :: (a i32, b i32) -> i32 { +export proc max :: (a i32, b i32) -> i32 { /* Curly braces are required */ x := "String literal! HERE \\\"Woot Woot\" done"; @@ -17,4 +17,4 @@ export max :: (a i32, b i32) -> i32 { } else { return b; } -} \ No newline at end of file +}; \ No newline at end of file -- 2.25.1