diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2019-08-19 15:40:46 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2019-08-19 15:40:46 -0400 |
commit | 4ac607e47f0b046f627aaa1df618c43bf096260e (patch) | |
tree | fcde7844b26dee841177ab61f202636ba8f83543 /util | |
parent | 00cb291c4bf2c64342b00152e58f2544e66ddb2c (diff) |
Added basic unary/binary expressions
Diffstat (limited to 'util')
-rw-r--r-- | util/arr.c | 67 | ||||
-rw-r--r-- | util/err.c | 17 |
2 files changed, 50 insertions, 34 deletions
@@ -1,28 +1,43 @@ -#define arr_declaration(arr_type, type, prefix) typedef struct { \ - type *data; \ - size_t cap; \ - size_t len; \ - } arr_type; \ - static void prefix##create(arr_type *arr) { \ - arr->data = NULL; \ - arr->cap = 0; \ - arr->len = 0; \ - } \ - static void prefix##reserve(arr_type *arr, size_t n) { \ - arr->data = err_realloc(arr->data, n * sizeof(*arr->data)); \ - arr->cap = n; \ - } \ - static void prefix##add(arr_type *arr, type *item) { \ - if (arr->len >= arr->cap) { \ - prefix##reserve(arr, 2 * arr->len + 2); \ - } \ - arr->data[arr->len++] = *item; \ - } \ - static void prefix##clear(arr_type *arr) { \ - free(arr->data); \ - arr->data = NULL; \ - arr->cap = 0; \ - arr->len = 0; \ +typedef struct { + void *data; + void *last; + size_t len; + size_t cap; + size_t item_sz; +} Array; + +void arr_create(Array *arr, size_t item_sz) { + arr->len = arr->cap = 0; + arr->item_sz = item_sz; + arr->data = NULL; + arr->last = NULL; +} + +void arr_reserve(Array *arr, size_t n) { + arr->cap = n; + arr->data = realloc(arr->data, arr->item_sz * arr->cap); + arr->last = (void*)((char*)arr->data + arr->item_sz * (arr->len - 1)); +} + +void *arr_add(Array *arr) { + if (arr->len >= arr->cap) { + arr_reserve(arr, (arr->cap + 2) * 2); } + arr->len++; + arr->last = (char*)arr->last + arr->item_sz; + void *item = arr->last; + return item; +} + +void arr_free(Array *arr) { + free(arr->data); +} + +void arr_clear(Array *arr) { + free(arr->data); + arr->len = arr->cap = 0; + arr->data = NULL; + arr->last = NULL; +} -#define arr_foreach(arr, type, var) for (type *var = (arr).data, *arr_iterate_last_ = (arr).data + ((arr).len - 1); var; (var == arr_iterate_last_) ? var = NULL : var++) +#define arr_foreach(arr, type, var) for (type *var = (arr)->data; var; var == (arr)->last ? var = NULL : var++) @@ -47,14 +47,15 @@ static void err_print_footer_(const char *context) { } /* Write nicely-formatted errors to the error file */ -static void err_print(LineNo line, const char *context, const char *fmt, ...) { - err_print_header_(line); - va_list args; - va_start(args, fmt); - err_vfprint(fmt, args); - va_end(args); - err_print_footer_(context); -} + +/* static void err_print(LineNo line, const char *context, const char *fmt, ...) { */ +/* err_print_header_(line); */ +/* va_list args; */ +/* va_start(args, fmt); */ +/* err_vfprint(fmt, args); */ +/* va_end(args); */ +/* err_print_footer_(context); */ +/* } */ static void err_vprint(LineNo line, const char *context, const char *fmt, va_list args) { err_print_header_(line); |