shithub: orca

Download patch

ref: 5fb0071da18c0bacf0059533c73e3938882a4531
parent: 997ef43a595747ce9dcc58ba8ffb93d50a3b3188
author: cancel <cancel@cancel.fm>
date: Wed Jan 8 02:42:59 EST 2020

Change to use sdd instead of Heapstr in tui

--- a/term_util.c
+++ b/term_util.c
@@ -1,41 +1,9 @@
 #include "term_util.h"
+#include "sdd.h"
 #include <ctype.h>
 #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);
-  hs->str[len] = 0;
-}
-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
@@ -282,7 +250,7 @@
   if (curlinewidth > maxlinewidth)
     maxlinewidth = curlinewidth;
   int width = titlewidth > maxlinewidth ? titlewidth : maxlinewidth;
-  width += 2; // 1 padding on left and right each
+  width += 2;                          // 1 padding on left and right each
   Qmsg* msg = qmsg_push(lines, width); // no wrapping yet, no real wcwidth, etc
   WINDOW* msgw = qmsg_window(msg);
   int i = 0;
@@ -483,7 +451,8 @@
   set_menu_grey(qm->ncurses_menu, A_DIM);
   int menu_min_h, menu_min_w;
   scale_menu(qm->ncurses_menu, &menu_min_h, &menu_min_w);
-  if (!qm->has_submenu_item) menu_min_w += 1; // temp hack
+  if (!qm->has_submenu_item)
+    menu_min_w += 1; // temp hack
   if (qm->qblock.title) {
     // Stupid lack of wcswidth() means we can't know how wide this string is
     // actually displayed. Just fake it for now, until we have Unicode strings
@@ -696,7 +665,7 @@
   return NULL;
 }
 
-bool qform_get_text_line(Qform const* qf, int id, Heapstr* out) {
+bool qform_get_text_line(Qform const* qf, int id, sdd** out) {
   FIELD* f = qform_find_field(qf, id);
   if (!f)
     return false;
@@ -705,6 +674,6 @@
   if (!buf)
     return false;
   Usz trimmed = size_without_trailing_spaces(buf);
-  heapstr_set_cstrlen(out, buf, trimmed);
-  return true;
+  *out = *out ? sdd_cpylen(*out, buf, trimmed) : sdd_newlen(buf, trimmed);
+  return (bool)*out;
 }
--- a/term_util.h
+++ b/term_util.h
@@ -2,22 +2,10 @@
 #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)
 
+struct sdd;
+
 typedef enum {
   C_natural,
   C_black,
@@ -155,6 +143,6 @@
 void qform_push_to_nav(Qform* qf);
 void qform_set_title(Qform* qf, char const* title);
 bool qform_drive(Qform* qf, int key, Qform_action* out_action);
-bool qform_get_text_line(Qform const* qf, int id, Heapstr* out);
+bool qform_get_text_line(Qform const* qf, int id, struct sdd** out);
 
 extern Qnav_stack qnav_stack;
--- a/tui_main.c
+++ b/tui_main.c
@@ -3,6 +3,7 @@
 #include "field.h"
 #include "gbuffer.h"
 #include "osc_out.h"
+#include "sdd.h"
 #include "sim.h"
 #include "sysmisc.h"
 #include "term_util.h"
@@ -2133,15 +2134,15 @@
   qform_push_to_nav(qf);
 }
 
-bool try_save_with_msg(Field* field, Heapstr const* hstr) {
-  if (!heapstr_len(hstr))
+bool try_save_with_msg(Field* field, sdd const* str) {
+  if (!sdd_len(str))
     return false;
-  bool ok = hacky_try_save(field, hstr->str);
+  bool ok = hacky_try_save(field, sddc(str));
   if (ok) {
-    qmsg_printf_push(NULL, "Saved to:\n%s", hstr->str);
+    qmsg_printf_push(NULL, "Saved to:\n%s", sddc(str));
   } else {
     qmsg_printf_push("Error Saving File", "Unable to save file to:\n%s",
-                     hstr->str);
+                     sddc(str));
   }
   return ok;
 }
@@ -2379,7 +2380,7 @@
        Argopt_portmidi_output_device},
 #endif
       {NULL, 0, NULL, 0}};
-  char* input_file = NULL;
+  sdd* file_name = NULL;
   int undo_history_limit = 100;
   char const* osc_hostname = NULL;
   char const* osc_port = NULL;
@@ -2537,7 +2538,7 @@
 
   if (optind == argc - 1) {
     should_autosize_grid = false;
-    input_file = argv[optind];
+    file_name = sdd_new(argv[optind]);
   } else if (optind < argc - 1) {
     fprintf(stderr, "Expected only 1 file argument.\n");
     exit(1);
@@ -2571,20 +2572,18 @@
     }
   }
 
-  Heapstr file_name;
-
-  if (input_file) {
-    Field_load_error fle = field_load_file(input_file, &ged_state.field);
+  if (file_name) {
+    Field_load_error fle = field_load_file(sddc(file_name), &ged_state.field);
     if (fle != Field_load_error_ok) {
       char const* errstr = field_load_error_string(fle);
       fprintf(stderr, "File load error: %s.\n", errstr);
       ged_deinit(&ged_state);
       qnav_deinit();
+      sdd_free(file_name);
       exit(1);
     }
-    heapstr_init_cstr(&file_name, input_file);
   } else {
-    heapstr_init_cstr(&file_name, "");
+    file_name = sdd_newcap(0);
     // Temp hacky stuff: we've crammed two code paths into the KEY_RESIZE event
     // case. One of them is for the initial setup for an automatic grid size.
     // The other is for actual resize events. We will factor this out into
@@ -2599,7 +2598,7 @@
                       (Usz)init_grid_dim_x, '.');
     }
   }
-  ged_state.filename = heapstr_len(&file_name) > 0 ? file_name.str : "unnamed";
+  ged_state.filename = sdd_len(file_name) ? sddc(file_name) : "unnamed";
   ged_set_midi_mode(&ged_state, &midi_mode);
 
   // Set up timer lib
@@ -2903,17 +2902,17 @@
                 push_confirm_new_file_menu();
                 break;
               case Main_menu_open:
-                push_open_form(file_name.str);
+                push_open_form(sddc(file_name));
                 break;
               case Main_menu_save:
-                if (heapstr_len(&file_name) > 0) {
-                  try_save_with_msg(&ged_state.field, &file_name);
+                if (sdd_len(file_name) > 0) {
+                  try_save_with_msg(&ged_state.field, file_name);
                 } else {
                   push_save_as_form("");
                 }
                 break;
               case Main_menu_save_as:
-                push_save_as_form(file_name.str);
+                push_save_as_form(sddc(file_name));
                 break;
               case Main_menu_set_tempo:
                 push_set_tempo_form(ged_state.bpm);
@@ -2987,7 +2986,7 @@
                   ged_make_cursor_visible(&ged_state);
                   ged_state.needs_remarking = true;
                   ged_state.is_draw_dirty = true;
-                  heapstr_set_cstr(&file_name, "");
+                  sdd_clear(file_name);
                   ged_state.filename = "unnamed"; // slightly redundant
                   qnav_stack_pop();
                   pop_qnav_if_main_menu();
@@ -3023,18 +3022,18 @@
           case Qform_action_type_submitted: {
             switch (qform_id(qf)) {
             case Open_form_id: {
-              Heapstr temp_name;
-              heapstr_init(&temp_name);
+              sdd* temp_name = NULL;
               if (qform_get_text_line(qf, Open_name_text_line_id, &temp_name) &&
-                  heapstr_len(&temp_name) > 0) {
+                  sdd_len(temp_name) > 0) {
                 undo_history_push(&ged_state.undo_hist, &ged_state.field,
                                   ged_state.tick_num);
                 Field_load_error fle =
-                    field_load_file(temp_name.str, &ged_state.field);
+                    field_load_file(sddc(temp_name), &ged_state.field);
                 if (fle == Field_load_error_ok) {
                   qnav_stack_pop();
-                  heapstr_set_cstr(&file_name, temp_name.str);
-                  ged_state.filename = file_name.str;
+                  file_name = sdd_cpylen(file_name, sddc(temp_name),
+                                         sdd_len(temp_name));
+                  ged_state.filename = sddc(file_name);
                   mbuf_reusable_ensure_size(&ged_state.mbuf_r,
                                             ged_state.field.height,
                                             ged_state.field.width);
@@ -3050,45 +3049,44 @@
                   undo_history_pop(&ged_state.undo_hist, &ged_state.field,
                                    &ged_state.tick_num);
                   qmsg_printf_push("Error Loading File", "%s:\n%s",
-                                   temp_name.str, field_load_error_string(fle));
+                                   sddc(temp_name),
+                                   field_load_error_string(fle));
                 }
               }
-              heapstr_deinit(&temp_name);
+              sdd_free(temp_name);
             } break;
             case Save_as_form_id: {
-              Heapstr temp_name;
-              heapstr_init(&temp_name);
+              sdd* temp_name = NULL;
               if (qform_get_text_line(qf, Save_as_name_id, &temp_name) &&
-                  heapstr_len(&temp_name) > 0) {
+                  sdd_len(temp_name) > 0) {
                 qnav_stack_pop();
-                bool saved_ok = try_save_with_msg(&ged_state.field, &temp_name);
+                bool saved_ok = try_save_with_msg(&ged_state.field, temp_name);
                 if (saved_ok) {
-                  heapstr_set_cstr(&file_name, temp_name.str);
-                  ged_state.filename = file_name.str;
+                  file_name = sdd_cpylen(file_name, sddc(temp_name),
+                                         sdd_len(temp_name));
+                  ged_state.filename = sddc(file_name);
                 }
               }
-              heapstr_deinit(&temp_name);
+              sdd_free(temp_name);
             } break;
             case Set_tempo_form_id: {
-              Heapstr tmpstr;
-              heapstr_init(&tmpstr);
+              sdd* tmpstr = NULL;
               if (qform_get_text_line(qf, Tempo_text_line_id, &tmpstr) &&
-                  heapstr_len(&tmpstr) > 0) {
-                int newbpm = atoi(tmpstr.str);
+                  sdd_len(tmpstr) > 0) {
+                int newbpm = atoi(sddc(tmpstr));
                 if (newbpm > 0) {
                   ged_state.bpm = (Usz)newbpm;
                   qnav_stack_pop();
                 }
               }
-              heapstr_deinit(&tmpstr);
+              sdd_free(tmpstr);
             } break;
             case Set_grid_dims_form_id: {
-              Heapstr tmpstr;
-              heapstr_init(&tmpstr);
+              sdd* tmpstr = NULL;
               if (qform_get_text_line(qf, Tempo_text_line_id, &tmpstr) &&
-                  heapstr_len(&tmpstr) > 0) {
+                  sdd_len(tmpstr) > 0) {
                 int newheight, newwidth;
-                if (sscanf(tmpstr.str, "%dx%d", &newwidth, &newheight) == 2 &&
+                if (sscanf(sddc(tmpstr), "%dx%d", &newwidth, &newheight) == 2 &&
                     newheight > 0 && newwidth > 0 && newheight < ORCA_Y_MAX &&
                     newwidth < ORCA_X_MAX) {
                   if (ged_state.field.height != (Usz)newheight ||
@@ -3106,7 +3104,7 @@
                   qnav_stack_pop();
                 }
               }
-              heapstr_deinit(&tmpstr);
+              sdd_free(tmpstr);
             } break;
             }
           } break;
@@ -3174,7 +3172,7 @@
     case CTRL_PLUS('q'):
       goto quit;
     case CTRL_PLUS('o'):
-      push_open_form(file_name.str);
+      push_open_form(sddc(file_name));
       break;
     case KEY_UP:
     case CTRL_PLUS('k'):
@@ -3398,8 +3396,8 @@
       break;
     case CTRL_PLUS('s'):
       // TODO duplicated with menu item code
-      if (heapstr_len(&file_name) > 0) {
-        try_save_with_msg(&ged_state.field, &file_name);
+      if (sdd_len(file_name) > 0) {
+        try_save_with_msg(&ged_state.field, file_name);
       } else {
         push_save_as_form("");
       }
@@ -3432,7 +3430,7 @@
   printf("\033[?2004h\n"); // Tell terminal to not use bracketed paste
   endwin();
   ged_deinit(&ged_state);
-  heapstr_deinit(&file_name);
+  sdd_free(file_name);
   midi_mode_deinit(&midi_mode);
 #ifdef FEAT_PORTMIDI
   if (portmidi_is_initialized)