Browse Source

Add start of more advanced file name handling

master
cancel 6 years ago
parent
commit
97c05c3efc
  1. 34
      term_util.c
  2. 14
      term_util.h
  3. 11
      tui_main.c

34
term_util.c

@ -2,6 +2,40 @@
#include <form.h>
#include <menu.h>
// 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

14
term_util.h

@ -2,6 +2,20 @@
#include "base.h"
#include <ncurses.h>
// 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 {

11
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;
}

Loading…
Cancel
Save