From 5ea28bbeee5639ac65d9fd20728f63f77b13ba1d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 12 May 2020 15:03:58 -0500 Subject: [PATCH] Finished bh_arr --- bh.h | 128 +++++++++++++++++++++++++++++++++++++++++++++++------- onyx | Bin 37160 -> 41936 bytes onyx.c | 54 +++++++++-------------- onyxlex.c | 15 ++++--- onyxlex.h | 2 +- 5 files changed, 142 insertions(+), 57 deletions(-) diff --git a/bh.h b/bh.h index 16a51c87..c322aa80 100644 --- a/bh.h +++ b/bh.h @@ -37,6 +37,13 @@ b32 char_in_range(const char lo, const char hi, const char a); char charset_contains(const char* charset, char ch); i64 chars_match(char* ptr1, char* ptr2); +//------------------------------------------------------------------------------------- +// Better math functions +//------------------------------------------------------------------------------------- +#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)))) + //------------------------------------------------------------------------------------- // Better strings //------------------------------------------------------------------------------------- @@ -155,35 +162,60 @@ bh_file_contents bh_file_read_contents_direct(const char* filename); i32 bh_file_contents_delete(bh_file_contents* contents); //------------------------------------------------------------------------------------- -// Better arrays +// Better dynamically-sized arrays //------------------------------------------------------------------------------------- typedef struct bh__arr { i32 length, capacity; } bh__arr; +#ifndef BH_ARR_GROW_FORMULA +#define BH_ARR_GROW_FORMULA(x) ((x) > 0 ? ((x) << 1) : 4) +#endif + #define bh_arr(T) T* #define bh__arrhead(arr) (((bh__arr *)(arr)) - 1) #define bh_arr_length(arr) (arr ? bh__arrhead(arr)->length : 0) #define bh_arr_capacity(arr) (arr ? bh__arrhead(arr)->capacity : 0) -#define bh_arr_valid(arr, i) (arr ? (int)(i) < bh__arrhead(arr)->length : 0) - -#define bh_arr_set_length(arr, n) (bh__arr_ensure_capacity((void **) &arr, sizeof(arr[0]), n), bh__arrhead(arr)->length = n) +#define bh_arr_size(arr) (arr ? bh__arrhead(arr)->capacity * sizeof(*(arr)) : 0) +#define bh_arr_valid(arr, i) (arr ? (i32)(i) < bh__arrhead(arr)->length : 0) #define bh_arr_pop(arr) ((arr)[--bh__arrhead(arr)->length]) #define bh_arr_last(arr) ((arr)[bh__arrhead(arr)->length - 1]) #define bh_arr_end(arr, i) ((i) >= &(arr)[bh_arr_length(arr)]) -#define bh_arr_new(arr, cap) (bh__arr_ensure_capacity((void**) &arr, sizeof(arr[0]), cap)) -#define bh_arr_free(arr) (bh__arr_free((void**) &arr)) -#define bh_arr_copy(arr) (bh__arr_copy(arr, sizeof(arr[0]))) +#define bh_arr_new(arr, cap) (bh__arr_grow((void**) &arr, sizeof(*(arr)), cap)) +#define bh_arr_free(arr) (bh__arr_free((void**) &(arr))) +#define bh_arr_copy(arr) (bh__arr_copy((arr), sizeof(*(arr)))) + +#define bh_arr_grow(arr, cap) (bh__arr_grow((void **) &(arr), sizeof(*(arr)), cap)) +#define bh_arr_shrink(arr, cap) (bh__arr_shrink((void **) &(arr), sizeof(*(arr)), cap)) +#define bh_arr_set_length(arr, n) ( \ + bh__arr_grow((void **) &(arr), sizeof(*(arr)), n), \ + bh__arrhead(arr)->length = n) + +#define bh_arr_insertn(arr, i, n) (bh__arr_insertn((void **) &(arr), sizeof(*(arr)), i, n)) + #define bh_arr_insert_end(arr, n) ( \ - bh__arr_ensure_capacity((void**) &arr, sizeof(arr[0]), bh_arr_length(arr) + n), \ + bh__arr_grow((void **) &(arr), sizeof(*(arr)), bh_arr_length(arr) + n), \ bh__arrhead(arr)->length += n) -b32 bh__arr_ensure_capacity(void** arr, int elemsize, int cap); +#define bh_arr_push(arr, value) ( \ + bh__arr_grow((void **) &(arr), sizeof(*(arr)), bh_arr_length(arr) + 1), \ + arr[bh__arrhead(arr)->length++] = value) + +#define bh_arr_is_empty(arr) (arr ? bh__arrhead(arr)->length == 0 : 1) +#define bh_arr_clear(arr) (arr ? (bh__arrhead(arr)->length = 0) : 0) + +#define bh_arr_deleten(arr, i, n) (bh__arr_deleten((void **) &(arr), sizeof(*(arr)), i, n)) +#define bh_arr_fastdelete(arr, i) (arr[i] = arr[--bh__arrhead(arr)->length]) + +b32 bh__arr_grow(void** arr, i32 elemsize, i32 cap); +b32 bh__arr_shrink(void** arr, i32 elemsize, i32 cap); b32 bh__arr_free(void **arr); -void* bh__arr_copy(void *arr, int elemsize); +void* bh__arr_copy(void *arr, i32 elemsize); +void bh__arr_insertn(void **arr, i32 elemsize, i32 index, i32 numelems); +void bh__arr_deleten(void **arr, i32 elemsize, i32 index, i32 numelems); #ifdef BH_DEFINE #undef BH_DEFINE @@ -302,7 +334,7 @@ void bh_string_replace_at_bh_string(bh_string* dest, bh_string* src, u64 offset) void bh_string_replace_at_cstr(bh_string* dest, const char* src, u64 offset) { if (offset > dest->length) return; - const int srclen = strlen(src); + const i32 srclen = strlen(src); if (!bh_string_ensure_capacity(dest, offset + srclen)) return; memcpy(dest->data + offset, src, srclen); @@ -319,7 +351,7 @@ void bh_string_insert_at_bh_string(bh_string* dest, bh_string* src, u64 offset) } void bh_string_insert_at_cstr(bh_string* dest, const char* src, u64 offset) { - const int srclen = strlen(src); + const i32 srclen = strlen(src); if (!bh_string_ensure_capacity(dest, dest->length + srclen)) return; // TODO: Use something better. This copies to a seperate buffer first @@ -542,7 +574,7 @@ b32 bh_file_contents_delete(bh_file_contents* contents) { // ARRAY IMPLEMENTATION //------------------------------------------------------------------------------------- -b32 bh__arr_ensure_capacity(void** arr, int elemsize, int cap) { +b32 bh__arr_grow(void** arr, i32 elemsize, i32 cap) { bh__arr* arrptr; if (*arr == NULL) { @@ -558,8 +590,8 @@ b32 bh__arr_ensure_capacity(void** arr, int elemsize, int cap) { if (arrptr->capacity < cap) { void* p; - int newcap = arrptr->capacity ? arrptr->capacity : 4; - while (newcap < cap) newcap <<= 1; + i32 newcap = arrptr->capacity; + while (newcap < cap) newcap = BH_ARR_GROW_FORMULA(newcap); p = realloc(arrptr, sizeof(*arrptr) + elemsize * newcap); @@ -576,11 +608,77 @@ b32 bh__arr_ensure_capacity(void** arr, int elemsize, int cap) { return 1; } +b32 bh__arr_shrink(void** arr, i32 elemsize, i32 cap) { + if (*arr == NULL) return 0; + + bh__arr* arrptr = bh__arrhead(*arr); + cap = bh_max(cap, arrptr->length); + + if (arrptr->capacity > cap) { + void* p = realloc(arrptr, sizeof(*arrptr) + elemsize * cap); + + if (p) { + arrptr = (bh__arr *) p; + arrptr->capacity = cap; + } else { + return 0; + } + } + + *arr = arrptr + 1; + return 1; +} + b32 bh__arr_free(void **arr) { bh__arr* arrptr = bh__arrhead(*arr); free(arrptr); + *arr = NULL; +} + +void* bh__arr_copy(void *arr, i32 elemsize) { + bh__arr* arrptr = bh__arrhead(arr); + + const i32 cap = arrptr->length; + + void* newarr = NULL; + bh__arr_grow(&newarr, elemsize, cap); + bh__arrhead(newarr)->length = cap; + bh__arrhead(newarr)->capacity = cap; + memcpy(newarr, arr, elemsize * arrptr->length); + + return newarr; +} + +void bh__arr_deleten(void **arr, i32 elemsize, i32 index, i32 numelems) { + bh__arr* arrptr = bh__arrhead(*arr); + + if (index >= arrptr->length) return; // Can't delete past the end of the array + if (numelems <= 0) return; // Can't delete nothing + + memmove( + (char *)(*arr) + elemsize * index, // Target + (char *)(*arr) + elemsize * (index + numelems), // Source + elemsize * (arrptr->length - (index + numelems))); // Length + arrptr->length -= numelems; } +void bh__arr_insertn(void **arr, i32 elemsize, i32 index, i32 numelems) { + bh__arr* arrptr = bh__arrhead(*arr); + + if (numelems) { + if (*arr == NULL) { + bh__arr_grow(arr, elemsize, numelems); // Making a new array + return; + } + + if (!bh__arr_grow(arr, elemsize, arrptr->length + numelems)) return; // Fail case + memmove( + (char *)(*arr) + elemsize * (index + numelems), + (char *)(*arr) + elemsize * index, + elemsize * (arrptr->length - index)); + arrptr->length += numelems; + } +} #endif // ifdef BH_DEFINE diff --git a/onyx b/onyx index 6ea581cce3958f127854e5c867d1f2b65076bbfa..690a2c823d61c7cd3aca2909c5a31d6a81f43638 100755 GIT binary patch literal 41936 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 literal 37160 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 diff --git a/onyx.c b/onyx.c index 100dad99..d4b8f88e 100644 --- a/onyx.c +++ b/onyx.c @@ -5,29 +5,28 @@ #include "onyxlex.h" -int main(int argc, char const *argv[]) { - bh_arr(int) arr = NULL; // Must initialize to NULL - bh_arr_new(arr, 0); - - bh_arr_set_length(arr, 10); - for (int i = 0; i < 10; i++) - arr[i] = i; - printf("Length: %d\nCapacity: %d\n", bh_arr_length(arr), bh_arr_capacity(arr)); - - bh_arr_set_length(arr, 0); +bh_arr(Token) parse_tokens(bh_file_contents *fc) { + Tokenizer tknizer = { + .start = fc->data, + .curr = fc->data, + .end = fc->data + fc->length - 1, + .line_number = 1, + .line_start = fc->data, + }; - printf("Length: %d\nCapacity: %d\n", bh_arr_length(arr), bh_arr_capacity(arr)); + bh_arr(Token) token_arr = NULL; + bh_arr_grow(token_arr, 1024); - for (int* it = arr; !bh_arr_end(arr, it); it++) { - printf("%d ", *it); - } - - bh_arr_free(arr); + Token tk; + do { + tk = get_token(&tknizer); + bh_arr_push(token_arr, tk); + } while (tk.type != TOKEN_TYPE_END_STREAM); - return 0; + return token_arr; } -int main2(int argc, char *argv[]) { +int main(int argc, char *argv[]) { bh_file source_file; bh_file_error err = bh_file_open(&source_file, argv[1]); if (err != BH_FILE_ERROR_NONE) { @@ -38,25 +37,12 @@ int main2(int argc, char *argv[]) { bh_file_contents fc = bh_file_read_contents(&source_file); bh_file_close(&source_file); - Tokenizer tknizer = { - .start = fc.data, - .curr = fc.data, - .end = fc.data + fc.length - 1, - .line_number = 1, - .line_column = 1, - }; - - Token tk; - do { - tk = get_token(&tknizer); - char c = *(tk.token + tk.length); - *(tk.token + tk.length) = '\0'; - printf("Line %ld, Column %ld: \n%s: %s\n", tk.line_number, tk.line_column, get_token_type_name(tk), tk.token); - *(tk.token + tk.length) = c; - } while (tk.type != TOKEN_TYPE_END_STREAM); + bh_arr(Token) token_arr = parse_tokens(&fc); + printf("There are %d tokens (Allocated space for %d tokens)\n", bh_arr_length(token_arr), bh_arr_capacity(token_arr)); bh_file_contents_delete(&fc); + bh_arr_free(token_arr); return 0; } diff --git a/onyxlex.c b/onyxlex.c index a5945683..38c54c4c 100644 --- a/onyxlex.c +++ b/onyxlex.c @@ -55,11 +55,11 @@ static const char* TokenTypeNames[] = { #ifndef INCREMENT_CURR_TOKEN #define INCREMENT_CURR_TOKEN(tkn) { \ - tkn->curr++; \ - tkn->line_column++; \ - if (*tkn->curr == '\n') { \ - tkn->line_number++; \ - tkn->line_column = 1; \ + (tkn)->curr++; \ + while (*(tkn)->curr == '\n' && (tkn)->curr != (tkn)->end) { \ + (tkn)->curr++; \ + (tkn)->line_number++; \ + (tkn)->line_start = (tkn)->curr; \ } \ } #endif @@ -70,9 +70,10 @@ static b32 token_lit(Tokenizer* tokenizer, Token* tk, char* lit, TokenType type) tk->type = type; tk->token = tokenizer->curr; tk->length = len; + tk->line_number = tokenizer->line_number; + tk->line_column = (i32)(tokenizer->curr - tokenizer->line_start) + 1; tokenizer->curr += len; - tokenizer->line_column += len; return 1; } @@ -94,7 +95,7 @@ Token get_token(Tokenizer* tokenizer) { tk.token = tokenizer->curr; tk.length = 1; tk.line_number = tokenizer->line_number; - tk.line_column = tokenizer->line_column; + tk.line_column = (i32)(tokenizer->curr - tokenizer->line_start) + 1; if (tokenizer->curr == tokenizer->end) { tk.type = TOKEN_TYPE_END_STREAM; diff --git a/onyxlex.h b/onyxlex.h index 01dc7fd6..8fb15967 100644 --- a/onyxlex.h +++ b/onyxlex.h @@ -7,8 +7,8 @@ typedef struct Tokenizer { char *start, *curr, *end; // TODO: Fix the line number and column count + char* line_start; u64 line_number; - u64 line_column; } Tokenizer; typedef enum TokenType { -- 2.25.1