diff --git a/term_util.c b/term_util.c index 93c70e6..db483c8 100644 --- a/term_util.c +++ b/term_util.c @@ -2,6 +2,40 @@ #include #include +// No overflow checks in most of these guys. Switch to use 'sds' if we ever +// need anything more advanced. +void heapstr_init(Heapstr* hs) { + enum { InitialCapacity = 16 }; + hs->str = malloc(InitialCapacity); + hs->capacity = InitialCapacity; + hs->str[0] = 0; +} +void heapstr_init_cstr(Heapstr* hs, char const* cstr) { + Usz len = strlen(cstr); + hs->str = malloc(len + 1); + hs->capacity = len + 1; + memcpy(hs->str, cstr, len + 1); +} +void heapstr_deinit(Heapstr* hs) { free(hs->str); } +void heapstr_reserve(Heapstr* hs, Usz capacity) { + if (hs->capacity < capacity) { + Usz new_cap = orca_round_up_power2(capacity); + hs->str = realloc(hs->str, new_cap); + hs->capacity = new_cap; + } +} +void heapstr_set_cstrlen(Heapstr* hs, char const* cstr, Usz len) { + heapstr_reserve(hs, len + 1); + memcpy(hs->str, cstr, len + 1); +} +void heapstr_set_cstr(Heapstr* hs, char const* cstr) { + Usz len = strlen(cstr); + heapstr_set_cstrlen(hs, cstr, len); +} +Usz heapstr_len(Heapstr const* hs) { + return strlen(hs->str); +} + void term_util_init_colors() { if (has_colors()) { // Enable color diff --git a/term_util.h b/term_util.h index 44b5053..f2d883c 100644 --- a/term_util.h +++ b/term_util.h @@ -2,6 +2,20 @@ #include "base.h" #include +// Quick'n'dirty heap allocated string, zero-terminated, not 'binary safe' for +// null chars. +typedef struct { + char* str; + Usz capacity; +} Heapstr; + +void heapstr_init(Heapstr* hs); +void heapstr_init_cstr(Heapstr* hs, char const* cstr); +void heapstr_deinit(Heapstr* hs); +void heapstr_set_cstr(Heapstr* hs, char const* cstr); +void heapstr_set_cstrlen(Heapstr* hs, char const* cstr, Usz size); +Usz heapstr_len(Heapstr const* hs); + #define CTRL_PLUS(c) ((c)&037) typedef enum { diff --git a/tui_main.c b/tui_main.c index 701605d..4c5a3d6 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1742,6 +1742,8 @@ int main(int argc, char** argv) { } } + Heapstr file_name; + if (input_file) { Field_load_error fle = field_load_file(input_file, &ged_state.field); if (fle != Field_load_error_ok) { @@ -1767,13 +1769,15 @@ int main(int argc, char** argv) { } fprintf(stderr, "File load error: %s.\n", errstr); ged_deinit(&ged_state); + qnav_deinit(); return 1; } + heapstr_init_cstr(&file_name, input_file); } else { - input_file = "unnamed"; + heapstr_init_cstr(&file_name, "unnamed"); field_init_fill(&ged_state.field, 25, 57, '.'); } - ged_state.filename = input_file; + ged_state.filename = file_name.str; ged_set_midi_mode(&ged_state, &midi_mode); // Set up timer lib @@ -1962,7 +1966,7 @@ int main(int argc, char** argv) { try_save_with_msg(&ged_state); break; case Main_menu_save_as: - push_save_as_form(ged_state.filename); + push_save_as_form(file_name.str); break; } } @@ -2129,5 +2133,6 @@ quit: } endwin(); ged_deinit(&ged_state); + heapstr_deinit(&file_name); return 0; }